内存中 OLTP 不支持的 Transact-SQL 构造

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

内存优化表、本机编译的存储过程和用户定义函数不支持由基于磁盘的表、解释 Transact-SQL 存储过程和用户定义函数所支持的完整 Transact-SQL 外围应用。 尝试使用某个不支持的功能时,服务器返回错误。

错误消息文本提及 Transact-SQL 语句的类型(例如功能、操作、选项)以及功能或 Transact-SQL 关键字的名称。 大多数不支持的功能将返回错误 10794,并带有错误消息文本,指示不支持该功能。 下表列出可在错误消息文本中显示的 Transact-SQL 功能和关键字,以及用于解决问题的更正操作。

有关内存优化表和本机编译的存储过程支持的功能的更多信息,请参阅:

使用内存中 OLTP 的数据库

下表列出了不受支持的 Transact-SQL 功能,以及涉及内存中 OLTP 数据库的错误消息文本中可能显示的关键字。 此表还列出了错误的解决方法。

类型 名称 解决方法
选项 自动关闭 具有 MEMORY_OPTIMIZED_DATA 文件组的数据库不支持数据库选项 AUTO_CLOSE=ON。
选项 附加重建日志 对于具有 MEMORY_OPTIMIZED_DATA 文件组的数据库,不支持 CREATE 数据库选项 ATTACH_REBUILD_LOG。
功能 DATABASE 快照 具有 MEMORY_OPTIMIZED_DATA 文件组的数据库不支持创建数据库快照。
功能 使用 sync_method 为“数据库快照”或“数据库快照字符”的复制 对于包含 MEMORY_OPTIMIZED_DATA 文件组的数据库,不支持使用 sync_method 为“数据库快照”或“数据库快照字符”的复制。
功能 DBCC CHECKDB

DBCC CHECKTABLE
DBCC CHECKDB 跳过数据库中的内存优化表。

对内存优化表执行 DBCC CHECKTABLE 将失败。

内存优化表

下表列出了不受支持的 Transact-SQL 功能,以及涉及内存优化表的错误消息文本中可能显示的关键字。 此表还列出了错误的解决方法。

类型 名称 解决方法
功能 内存优化的表不能放置在文件组或分区方案上。 从 CREATE TABLE 语句中删除 ON 子句。

所有的内存优化表都映射到内存优化文件组。
数据类型 数据类型名称 不支持所示的数据类型。 使用支持的数据类型之一替换该类型。 有关详细信息,请参阅 内存中 OLTP 支持的数据类型
功能 计算列 适用于:SQL Server 2014 (12.x) 和 SQL Server 2016 (13.x)
内存优化表不支持计算列。 从 CREATE TABLE 语句中删除计算列。

Azure SQL 数据库和自 SQL Server 2017 (14.x) 开始的 SQL Server 支持内存优化表和索引中的计算列。
功能 复制 内存优化表不支持复制。
功能 FILESTREAM 内存优化表的列不支持 FILESTREAM 存储。 从列定义中删除 FILESTREAM 关键字。
功能 SPARSE 内存优化表的列不能定义为 SPARSE。 从列定义中删除 SPARSE 关键字。
功能 ROWGUIDCOL 内存优化表的列不支持 ROWGUIDCOL 选项。 从列定义中删除 ROWGUIDCOL 关键字。
功能 外键 适用范围: Azure SQL 数据库 以及 SQL Server 2016(13.x)及更高版本
对于内存优化表,FOREIGN KEY 约束仅支持引用其他内存优化表主键的外键。 如果外键引用了唯一约束,请从表定义中删除该约束。

在 SQL Server 2014 (12.x) 中,FOREIGN KEY 约束不支持内存优化表。
功能 聚簇索引 指定非聚集索引。 对于主键索引,请务必指定 PRIMARY KEY NONCLUSTERED
功能 事务中的 DDL 不能在用户事务中创建或删除内存优化表和本机编译存储过程。 在执行 CREATE 或 DROP 语句之前,请勿启动事务并确保会话设置 IMPLICIT_TRANSACTIONS 为 OFF。
功能 DDL 触发器 如果存在该 DDL 操作的服务器或数据库触发器,则无法创建或删除内存优化的表和本机编译的存储过程。 删除 CREATE/DROP TABLE 和 CREATE/DROP PROCEDURE 上的服务器和数据库级触发器。
功能 EVENT NOTIFICATION 如果存在该 DDL 操作的服务器或数据库事件通知,则无法创建或删除内存优化的表和本机编译的存储过程。 删除位于 CREATE TABLE 或 DROP TABLE 以及 CREATE PROCEDURE 或 DROP PROCEDURE 上的服务器事件通知和数据库事件通知。
功能 FileTable 内存优化表不能作为文件表创建。 从语句中删除参数 CREATE TABLE
操作 更新主键列 无法更新内存优化的表和表类型中的主键列。 如果需要更新主键,请删除旧的行并插入包含更新的主键的新行。
操作 CREATE INDEX 内存优化表上的索引必须在 CREATE TABLE 语句中内联指定,或者使用 ALTER TABLE 语句指定。
操作 CREATE FULLTEXT INDEX 内存优化表不支持全文索引。
操作 架构更改 内存优化表和本机编译存储过程不支持某些架构更改:
Azure SQL 数据库 和 SQL Server(从 SQL Server 2017 (14.x) 开始)支持 ALTER TABLE、ALTER PROCEDURE 和 sp_rename 操作。 不支持其他架构更改,如添加扩展属性。

SQL Server 2016(13.x):支持 ALTER TABLE 和 ALTER PROCEDURE 操作。 不支持其他架构更改,包括 sp_rename。

SQL Server 2014 (12.x):不支持架构更改。 若要更改内存优化表或本机编译存储过程的定义,首先删除该对象,然后用所需定义重新创建。
操作 TRUNCATE TABLE 内存优化表不支持 TRUNCATE 操作。 若要删除表中的所有行,请使用 DELETE FROM 语句删除所有行,或者删除并重新创建表。
操作 ALTER AUTHORIZATION 不支持更改现有内存优化的表或本机编译的存储过程的所有者。 请删除并重新创建该表或过程来更改所有权。
操作 ALTER SCHEMA 不支持将现有表或本机编译存储过程传输到另一个架构。 删除并重新创建要在架构之间传输的对象。
操作 DBCC CHECKTABLE 不支持对内存优化表执行 DBCC CHECKTABLE 操作。 若要验证磁盘上检查点文件的完整性,请执行 MEMORY_OPTIMIZED_DATA 文件组的备份。
功能 ANSI_PADDING 关闭 创建内存优化表或本机编译的存储过程时,会话选项 ANSI_PADDING 必须为 ON。 在运行 CREATE 语句之前执行 SET ANSI_PADDING ON
选项 数据压缩 内存优化的表不支持数据压缩。 从表定义中删除该选项。
功能 DTC 无法通过分布式事务访问内存优化表和本机编译存储过程。 请改用 SQL 事务。
操作 将内存优化表作为 MERGE 内存优化表不能作为 MERGE 操作的目标。 请改用INSERTUPDATEDELETE语句。

内存优化表上的索引

下表列出可在涉及内存优化表的索引错误消息文本中显示的 Transact-SQL 功能和关键字,以及用于解决问题的更正操作。

类型 名称 解决方法
功能 筛选索引 内存优化表不支持筛选索引。 从索引定义中省略 WHERE 子句。
功能 包含的列 对于内存优化表,无需指定包含列。 内存优化表的所有列都隐式包含在每个内存优化索引中。
操作 DROP INDEX 不支持删除内存优化表的索引。 您可以使用 ALTER TABLE 删除索引。

有关详细信息,请参阅 更改内存优化表
索引选项 索引选项 对于 HASH 索引,仅支持一个索引选项:BUCKET_COUNT。

非聚集哈希索引

下表列出可在涉及非聚集哈希索引的错误消息文本中显示的 Transact-SQL 功能和关键字,以及用于解决问题的更正操作。

类型 名称 解决方法
选项 ASC/DESC 非聚集哈希索引不排序。 从索引键定义中删除关键字 ASCDESC

本机编译存储过程和用户定义函数

下表列出了 Transact-SQL 功能、涉及本机编译存储过程和用户定义函数的错误消息文本中可能显示的关键字,以及解决错误的纠正措施。

类型 功能 解决方法
功能 内联表变量 不能与变量声明一起以内联方式声明表类型。 表类型必须使用 CREATE TYPE 语句显式声明。
功能 游标 的对象时,不支持在原生编译的存储过程中使用游标。

从客户端执行该过程时,请使用 RPC 而非游标 API。 对于 ODBC,避免使用 Transact-SQL 语句 EXECUTE,而是直接指定过程的名称。

当从 Transact-SQL 批处理或另一个存储过程中执行该过程时,请避免对本机编译存储过程使用游标。

创建本机编译的存储过程时,请使用基于集的逻辑或 WHILE 循环而不要使用游标。
功能 非常量参数默认值 将默认值与本机编译的存储过程参数一起使用时,这些值必须为常量。 从参数声明中删除所有通配符。
功能 外部 CLR 存储过程无法进行原生编译。 从 CREATE PROCEDURE 语句中删除 AS EXTERNAL 子句或 NATIVE_COMPILATION 选项。
功能 带编号的存储过程 不能对本机编译的存储过程编号。 从 CREATE PROCEDURE 语句中删除 ;number
功能 多行 INSERT ... VALUES 语句 无法在原生编译的存储过程中使用相同的 INSERT 语句插入多行。 为每个行创建 INSERT 语句。
功能 通用表表达式 (CTE) 本机编译存储过程不支持公用表表达式 (CTE)。 重写查询。
功能 计算 不支持 COMPUTE 子句。 从查询中删除它。
功能 SELECT INTO INTO 语句不支持 SELECT 子句。 将查询重写为 INSERT INTOTableSELECT
功能 不完整的插入列列表 一般来说,在 INSERT 语句中,必须为表中的所有列指定值。

但是,我们确实支持在内存优化表上使用 DEFAULT 约束和 IDENTITY (1,1) 列。 这些列可以从 INSERT 列表中省略,而对于 IDENTITY 列,则必须省略。
功能 Function 某些内置函数在本机编译的存储过程中不受支持。 从存储过程中删除被拒绝的函数。 有关支持的内置函数的详细信息,请参阅
本机编译的 T-SQL 模块支持的功能,或
本机编译的存储过程
功能 案例 适用范围: SQL Server 2014 (12.x) 以及从 SQL Server 2016 (13.x) 开始的 SQL Server
在本机编译的存储过程中的查询中,不支持 CASE 表达式。 为每种情况创建查询。 有关详细信息,请参阅在原生编译的存储过程中实现 CASE 表达式

Azure SQL 数据库 和 SQL Server(从 SQL Server 2017 (14.x) 开始)支持 CASE 表达式。
功能 INSERT 执行 删除引用。
功能 EXECUTE 仅支持执行本机编译存储过程和用户定义函数。
功能 用户定义聚合 不能在本机编译的存储过程中使用用户定义的聚合函数。 从过程中删除对该函数的引用。
功能 浏览模式元数据 本机编译的存储过程不支持浏览模式元数据。 确保会话选项 NO_BROWSETABLE 设置为 OFF。
功能 DELETE 带 FROM 子句 在原生编译的存储过程中,FROM 子句不适用于 DELETE 语句(其数据源为表)。

DELETEFROM 子句一起使用,且该子句用于指示要从中删除数据的表时,此用法受支持。
功能 UPDATE 带 FROM 子句 在原生编译的存储过程中,FROM 子句不支持 UPDATE 语句。
功能 临时程序 临时存储过程无法进行本机编译。 请创建永久的本机编译存储过程或临时的解释型 Transact-SQL 存储过程。
隔离级别 READ UNCOMMITTED 原生编译的存储过程不支持 READ UNCOMMITTED 隔离级别。 请使用支持的隔离级别,如 SNAPSHOT。
隔离级别 READ COMMITTED 原生编译的存储过程不支持 READ COMMITTED 隔离级别。 请使用支持的隔离级别,如 SNAPSHOT。
功能 临时表 tempdb 中的表不能在本机编译型存储过程中使用。 请改用表变量或设置 DURABILITY=SCHEMA_ONLY 的内存优化表。
功能 DTC 无法通过分布式事务访问内存优化表和本机编译存储过程。 请改用 SQL 事务。
功能 EXECUTE WITH RECOMPILE 原生编译的存储过程不支持 WITH RECOMPILE 选项。
功能 通过专用管理员连接执行。 无法通过专用管理连接 (DAC) 执行原生编译的存储过程。 请改用常规连接。
操作 savepoint 无法从具有活动保存点的事务中调用原生编译的存储过程。 请从事务中删除该保存点。
操作 ALTER AUTHORIZATION 不支持更改现有内存优化的表或本机编译的存储过程的所有者。 请删除并重新创建该表或过程来更改所有权。
操作员 OPENROWSET 不支持此运算符。 从本机编译的存储过程中删除 OPENROWSET
操作员 OPENQUERY 不支持此运算符。 从本机编译存储过程中删除OPENQUERY
操作员 OPENDATASOURCE 不支持此运算符。 从本机编译的存储过程中删除 OPENDATASOURCE
操作员 OPENXML 不支持此运算符。 从本机编译存储过程中删除 OPENXML
操作员 CONTAINSTABLE 不支持此运算符。 从本机编译的存储过程中删除 CONTAINSTABLE
操作员 FREETEXTTABLE 不支持此运算符。 从本机编译的存储过程中删除 FREETEXTTABLE
功能 表值函数 不能从本机编译的存储过程引用表值函数。 有可能解决此限制的一种方法是将表值函数中的逻辑添加到过程主体。
操作员 CHANGETABLE 不支持此运算符。 从本机编译存储过程中删除 CHANGETABLE
操作员 GOTO 不支持此运算符。 使用其他过程构造,如 WHILE。
操作员 OFFSET 不支持此运算符。 从本机编译的存储过程中删除 OFFSET
操作员 INTERSECT 不支持此运算符。 从本机编译的存储过程中删除 INTERSECT 。 在某些情况下,可以使用 INNER JOIN 获得相同的结果。
操作员 除外 不支持此运算符。 从本机编译的存储过程中删除 EXCEPT
操作员 APPLY 适用范围: SQL Server 2014 (12.x) 以及从 SQL Server 2016 (13.x) 开始的 SQL Server
不支持此运算符。 从本机编译的存储过程中删除 APPLY

Azure SQL 数据库和自 SQL Server 2017 (14.x) 开始的 SQL Server 支持本机编译模块中的 APPLY 运算符。
操作员 PIVOT 不支持此运算符。 从本机编译存储过程中删除 PIVOT
操作员 UNPIVOT 不支持此运算符。 从本机编译的存储过程中删除 UNPIVOT
操作员 CONTAINS 不支持此运算符。 从本机编译存储过程中删除CONTAINS
操作员 FREETEXT 不支持此运算符。 请从原生编译的存储过程中删除 FREETEXT
操作员 TSEQUAL 不支持此运算符。 从本机编译存储过程中删除 TSEQUAL
操作员 不支持此运算符。 从本机编译的存储过程中删除 LIKE
操作员 NEXT VALUE FOR 不能在本机编译的存储过程内引用序列。 使用解释的 Transact-SQL 获取值,然后将它传递到本机编译的存储过程。 有关详细信息,请参阅在内存优化表中实现IDENTITY
设置选项 选项 SET 选项不能在本机编译的存储过程内更改。 可以使用 BEGIN ATOMIC 语句设置某些选项。 有关详细信息,请参阅本机编译的存储过程中有关原子块的章节。
操作数 TABLESAMPLE 不支持此运算符。 从本机编译存储过程中删除 TABLESAMPLE
选项 RECOMPILE 本机编译存储过程在创建时即被编译。 从过程定义中删除 RECOMPILE

可以对本机编译存储过程执行 sp_recompile,使其在下一次执行时进行重新编译。
选项 加密 不支持此选项。 从过程定义中删除 ENCRYPTION
选项 用于复制 无法创建用于复制的本机编译存储过程。 从过程定义中删除 FOR REPLICATION
选项 FOR XML 不支持此选项。 从本机编译存储过程中删除 FOR XML
选项 用于浏览 不支持此选项。 从本机编译的存储过程中删除 FOR BROWSE
联接提示 HASH,MERGE 本机编译的存储过程仅支持嵌套的循环联接。 不支持哈希连接和合并连接。 删除联接提示。
查询提示 查询提示 此查询提示不位于本机编译的存储过程内。 有关支持的查询提示,请参阅查询提示 (Transact-SQL)
选项 百分比 TOP 子句不支持此选项。 从本机编译的存储过程中的查询中删除 PERCENT
选项 WITH TIES 适用于:SQL Server 2014 (12.x) 和 SQL Server 2016 (13.x)
TOP 子句不支持此选项。 从本机编译的存储过程中的查询中删除 WITH TIES

Azure SQL 数据库和 SQL Server(从 SQL Server 2017 (14.x) 开始)支持 TOP WITH TIES
聚合函数 聚合函数 并非支持所有聚合函数。 有关本机编译 T-SQL 模块中支持的聚合函数的详细信息,请参阅本机编译 T-SQL 模块中支持的功能
排名函数 排名函数 本机编译存储过程不支持排序函数。 从过程定义中删除它们。
函数 Function 不支持此函数。 有关本机编译 T-SQL 模块中受支持的函数的详细信息,请参阅本机编译 T-SQL 模块的受支持的功能
语句 语句 不支持此语句。 有关本机编译 T-SQL 模块中受支持的函数的详细信息,请参阅本机编译 T-SQL 模块的受支持的功能
功能 MIN 和 MAX 与二进制字符串和字符串一起使用 聚合函数 MINMAX 不能用于本机编译的存储过程中的字符和二进制字符串值。
功能 GROUP BY ALL 在本机编译型存储过程中,不能将 ALL 与 GROUP BY 子句一起使用。 从 GROUP BY 子句中删除 ALL。
功能 GROUP BY () 不支持按空列表分组。 删除 GROUP BY 子句,或在分组列表中加入列。
功能 ROLLUP ROLLUP 不能与本机编译的存储过程中的 GROUP BY 子句一起使用。 从过程定义中删除 ROLLUP
功能 CUBE 在原生编译的存储过程中,CUBE 不能与 GROUP BY 子句一起使用。 从过程定义中删除 CUBE
功能 分组集 在原生编译的存储过程中,GROUPING SETS 不能与 GROUP BY 子句一起使用。 从过程定义中删除 GROUPING SETS
功能 BEGIN TRANSACTION、COMMIT TRANSACTION 和 ROLLBACK TRANSACTION 使用 ATOMIC 块来控制事务和处理错误。 有关详细信息,请参阅 Atomic Blocks
功能 内联表变量声明。 表变量必须引用显式定义的内存优化表类型。 应创建内存优化的表类型并将该类型用于变量声明,而不应在行内指定类型。
功能 基于磁盘的表 无法从本机编译型存储过程中访问基于磁盘的表。 从本地编译的存储过程中删除对基于磁盘的表的引用。 或者,将基于磁盘的表迁移到内存优化表。
功能 视图 无法从本机编译型存储过程中访问视图。 不要引用视图,而应引用底层基表。
功能 表值函数 适用于:Azure SQL 数据库 和 SQL Server(从 SQL Server 2016 (13.x) 开始)
无法从本机编译的 T-SQL 模块中访问多语句表值函数。 支持内联表值函数,但必须使用 NATIVE_COMPILATION 创建该函数。

适用于:SQL Server 2014 (12.x)
不能从本机编译的 T-SQL 模块引用表值函数。
选项 打印 删除引用
功能 DDL 本机编译的 T-SQL 模块不支持 DDL。
选项 STATISTICS XML 不支持。 运行查询时,启用 STATISTICS XML 后,将返回 XML 内容,而不返回本机编译存储过程的部件。

访问内存优化表的事务

下表列出可在涉及访问内存优化表的事务错误消息文本中显示的 Transact-SQL 功能和关键字,以及用于解决问题的更正操作。

类型 名称 解决方法
功能 savepoint 不支持在访问内存优化的表的事务中创建显式保存点。
功能 绑定事务 绑定会话不能参与访问内存优化表的事务。 在执行过程前不要绑定会话。
功能 DTC 访问内存优化的表的事务不能是分布式事务。

另请参阅

迁移到内存中 OLTP