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

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

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

有关针对内存优化表和编辑编译的存储过程的支持的功能的详细信息,请参阅:

使用内存中 OLTP 的数据库

下表列出了可能出现在涉及 OLTP 数据库In-Memory错误的消息文本中的 Transact-SQL 功能和关键字。

类型 名称 解决方法
选项 AUTO_CLOSE 具有 MEMORY_OPTIMIZED_DATA 文件组的数据库不支持数据库选项 AUTO_CLOSE=ON。
选项 ATTACH_REBUILD_LOG 具有 MEMORY_OPTIMIZED_DATA 文件组的数据库不支持 CREATE 数据库选项 ATTACH_REBUILD_LOG。
Feature DATABASE SNAPSHOT 具有 MEMORY_OPTIMIZED_DATA 文件组的数据库不支持创建数据库快照。
Feature 使用 sync_method“database snapshot”或“database snapshot character”进行复制 具有 MEMORY_OPTIMIZED_DATA 文件组的数据库不支持使用 sync_method“database snapshot”或“database snapshot character”进行复制。
Feature DBCC CHECKDB

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

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

内存优化表

下表列出了可以出现在涉及内存优化表的错误的消息文本中的 Transact-SQL 功能和关键字,以及用于解决错误的纠正措施。

类型 名称 解决方法
Feature ON 内存优化的表不能放置在文件组或分区方案上。 从 CREATE TABLE 语句删除 ON 子句。
数据类型 数据类型名称 不支持所示的数据类型。 使用支持的数据类型之一替换该类型。 有关详细信息,请参阅 支持的数据类型
Feature 计算列 内存优化的表不支持计算列。 从 CREATE TABLE 语句删除计算列。
Feature 复制 内存优化表不支持复制。
Feature FILESTREAM 内存优化的表列不支持 FILESTREAM 存储。 从列定义中删除 FILESTREAM 关键字。
Feature SPARSE 内存优化的表列不能定义为 SPARSE。 从列定义中删除 SPARSE 关键字。
Feature ROWGUIDCOL 内存优化的表列不支持选项 ROWGUIDCOL。 从列定义中删除 ROWGUIDCOL 关键字。
Feature FOREIGN KEY 内存优化的表不支持 FOREIGN KEY 约束。 从表定义中删除该约束。

有关如何缓解缺乏对约束的支持的信息,请参阅 迁移检查和外键约束
功能 CHECK 内存优化的表不支持 CHECK 约束。 从表定义中删除该约束。

有关如何缓解缺乏对约束的支持的信息,请参阅 迁移检查和外键约束
功能 UNIQUE 内存优化的表不支持 UNIQUE 约束。 从表定义中删除该约束。

有关如何缓解缺乏对约束的支持的信息,请参阅 迁移检查和外键约束
功能 COLUMNSTORE 内存优化的表不支持 COLUMNSTORE 索引。 改为指定 NONCLUSTERED 或 NONCLUSTERED HASH 索引。
Feature 聚集索引 指定非聚集索引。 在主键索引的情况下,务必指定 PRIMARY KEY NONCLUSTERED [HASH]
功能 非 1252 代码页 具有数据类型 charvarchar 的内存优化表中的列必须使用代码页 1252。 请使用 n(var)char 替代 (var)char,或使用具有代码页 1252 的排序规则(例如 Latin1_General_BIN2)。 有关详细信息,请参阅 Collations and Code Pages
Feature 事务中的 DDL 在用户事务的上下文中无法创建或删除内存优化的表和本机编译的存储过程。 在执行 CREATE 或 DROP 语句前不要启动事务并确保会话设置 IMPLICIT_TRANSACTIONS 为 OFF。
Feature DDL 触发器 如果存在该 DDL 操作的服务器或数据库触发器,则无法创建或删除内存优化的表和本机编译的存储过程。 在 CREATE/DROP TABLE 和 CREATE/DROP PROCEDURE 时删除服务器和数据库触发器。
Feature EVENT NOTIFICATION 如果存在该 DDL 操作的服务器或数据库事件通知,则无法创建或删除内存优化的表和本机编译的存储过程。 在 CREATE TABLE 或 DROP TABLE 和 CREATE PROCEDURE 或 DROP PROCEDURE 时删除服务器和数据库事件通知。
Feature FileTable 无法将内存优化的表创建为文件表。 从 AS FileTable 语句删除参数 CREATE TABLE
Operation 更新主键列 无法更新内存优化的表和表类型中的主键列。 如果需要更新主键,请删除旧的行并插入包含更新的主键的新行。
Operation CREATE INDEX 必须使用 CREATE TABLE 语句内联指定内存优化的表的索引。 要将索引添加到内存优化的表,请删除并重新创建该表,包括指定新索引。
Operation ALTER TABLE 不支持更改内存优化的表。 删除表并使用更新的表定义重新创建它。
Operation CREATE FULLTEXT INDEX 内存优化的表不支持全文检索。
Operation 架构更改 内存优化的表和本机编译的存储过程不支持架构更改,例如 sp_rename

尝试作出架构更改(如重命名表)将产生错误 12320。内存优化的表不支持需要更改架构版本的操作(例如,重命名)。

要更改架构,请删除表或过程并使用更新的定义重新创建它。
Operation CREATE TRIGGER 不支持内存优化的表的触发器。
Operation TRUNCATE TABLE 内存优化的表不支持 TRUNCATE 操作。 若要从表中删除所有行,请使用 DELETE FROM 删除所有行,或者删除并重新创建表。
Operation ALTER AUTHORIZATION 不支持更改现有内存优化的表或本机编译的存储过程的所有者。 请删除并重新创建该表或过程来更改所有权。
Operation ALTER SCHEMA 不支持更改现有内存优化的表或本机编译的存储过程的架构。 若要更改架构,请删除再重新创建表或过程。
Operation DBCC CHECKTABLE 内存优化的表不支持 DBCC CHECKTABLE。
Feature ANSI_PADDING OFF 创建内存优化的表或本机编译的存储过程时会话选项 ANSI_PADDING 必须为 ON。 在运行 CREATE 语句前执行 SET ANSI_PADDING ON
选项 DATA_COMPRESSION 内存优化的表不支持数据压缩。 从表定义中删除该选项。
Feature DTC 不能从分布式事务访问内存优化的表和本机编译的存储过程。 请改用 SQL 事务。
Feature 多个活动的结果集 (MARS) 内存优化表不支持多个活动结果集 (MARS)。 此错误还可能指示使用了链接服务器。 链接服务器可以使用 MARS。 内存优化表不支持链接服务器。 请直接连接到内存优化的表所在的服务器和数据库。
Operation 内存优化的表作为 MERGE 的目标 内存优化的表不能是 MERGE 操作的目标。 请改用 INSERTUPDATEDELETE 语句。

内存优化的表的索引

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

类型 名称 解决方法
Feature 筛选索引 内存优化的表不支持筛选的索引。 从索引定义中省略 WHERE 子句。
功能 UNIQUE 内存优化的表不支持唯一索引。 从索引定义中删除参数 UNIQUE
功能 可为 Null 的列 内存优化表的索引键中的所有列必须指定为 NOT NULL。 包含具有索引键中所有列的 NOT NULL 约束。
功能 非 bin2 排序规则 必须使用 BIN2 排序规则声明内存优化的索引键中的所有字符列。 使用 COLLATE 子句在列定义中设置排序规则。 有关详细信息,请参阅 Collations and Code Pages
Feature 包含列 指定包含列不是内存优化表所必需的。 内存优化表的所有列都隐式包含在每个内存优化索引中。
Operation ALTER INDEX 不支持更改内存优化的表的索引。 请删除该表并使用更新的索引定义重新创建它。
Operation DROP INDEX 不支持删除内存优化的表的索引。 请删除该表并使用所需的索引重新创建它。
索引选项 索引选项 内存优化的表的索引不支持所示的索引选项。 从索引定义中删除该选项。

非聚集哈希索引

下表列出了可能出现在涉及非聚集哈希索引的错误的消息文本中的 Transact-SQL 功能和关键字,以及解决错误的纠正措施。

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

本机编译的存储过程

下表列出了可能出现在涉及本机编译存储过程的错误的消息文本中的 Transact-SQL 功能和关键字,以及解决错误的纠正措施。

类型 Feature 解决方法
Feature 内联表变量 不能使用变量声明内联声明表类型。 必须使用 CREATE TYPE 语句显式声明表类型。
Feature 游标 本机编译的存储过程不支持游标。

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

-从 Transact-SQL 批处理或其他存储过程执行过程时,请避免将游标与本机编译的存储过程一起使用。

-创建本机编译的存储过程时,而不是使用游标,而是使用基于集的 WHILE 逻辑或循环。
Feature 非常量参数默认值 将默认值与本机编译的存储过程参数一起使用时,这些值必须为常量。 从参数声明中删除所有通配符。
Feature EXTERNAL 无法本机编译 CLR 存储过程。 从 CREATE PROCEDURE 语句中删除 AS EXTERNAL 子句或 NATIVE_COMPILATION 选项。
Feature 带编号的存储过程 不能对本机编译的存储过程编号。 ;CREATE PROCEDURE 语句中删除数字
Feature 多行 INSERT ...VALUES 语句 在本机编译的存储过程中无法使用同一 INSERT 语句插入多行。 为每行创建 INSERT 语句。
Feature 公用表表达式 (CTE) 本机编译的存储过程中不支持公用表表达式 (CTE)。 重写查询。
Feature 子查询 不支持子查询(查询嵌套在另一个查询中)。 重写查询。
Feature COMPUTE 不支持 COMPUTE 子句。 从查询中删除它。
Feature SELECT INTO INTO 语句不支持 SELECT 子句。 将查询重写为 INSERT INTOTableSELECT
功能 OUTPUT 不支持 OUTPUT 子句。 从查询中删除它。
Feature 不完整的插入列列表 INSERT 语句中,必须为表中的所有列指定值。
函数 Function 本机编译的存储过程中不支持内置函数。 从存储过程中删除该函数。 有关支持的内置函数的详细信息,请参阅 本机编译的存储过程
Feature CASE 本机编译的存储过程内的查询中不支持 CASE 语句。 创建每个情况的查询。 有关详细信息,请参阅 实现 CASE 语句
功能 用户定义的函数 不能在本机编译的存储过程中使用用户定义函数。 从过程定义中删除对该函数的引用。
Feature 用户定义聚合 不能在本机编译的存储过程中使用用户定义的聚合函数。 从过程中删除对该函数的引用。
Feature 浏览模式元数据 本机编译的存储过程不支持浏览模式元数据。 确保将会话选项 NO_BROWSETABLE 设置为 OFF。
Feature 带 FROM 子句的 DELETE 表源在本机编译存储过程中的 FROM 语句不支持 DELETE 子句。

在指示要执行删除操作的表时,支持带 DELETE 子句的 FROM
Feature 带 FROM 子句的 UPDATE 本机编译的存储过程中的 FROM 语句不支持 UPDATE 子句。
Feature 临时程序 临时存储过程无法进行本机编译。 创建永久本机编译的存储过程或临时解释的 Transact-SQL 存储过程。
隔离级别 READ UNCOMMITTED 本机编译的存储过程不支持隔离级别 READ UNCOMMITTED。 请使用支持的隔离级别,如 SNAPSHOT。
隔离级别 READ COMMITTED 本机编译的存储过程不支持隔离级别 READ UNCOMMITTED。 请使用支持的隔离级别,如 SNAPSHOT。
Feature 临时表 tempdb 中的表不能在本机编译的存储过程中使用。 请使用表变量或 DURABILITY=SCHEMA_ONLY 的内存优化表。
Feature MARS 本机编译的存储过程不支持多个活动结果集 (MARS)。 此错误还可能指示使用了链接服务器。 链接服务器可以使用 MARS。 本机编译的存储过程不支持链接服务器。 请直接连接到本机编译的存储过程所在的服务器和数据库。
Feature DTC 不能从分布式事务访问内存优化的表和本机编译的存储过程。 请改用 SQL 事务。
Feature 非 bin2 排序规则 对本机编译的存储过程中的字符串执行比较、排序和其他操作需要使用 BIN2 排序规则。 使用 COLLATE 子句或使用具有合适排序规则的列和变量。 有关详细信息,请参阅 Collations and Code Pages
功能 按照 SC 排序规则截断字符串。 采用 _SC 排序规则的字符串使用 UTF-16 编码。 将 n(var)char 值转换具有更短长度的 n(var)char 值涉及截断。 这对于本机编译的存储过程中的 UTF-16 值不受支持。 避免 UTF-16 字符串的截断。
Feature EXECUTE WITH RECOMPILE 本机编译的存储过程不支持选项 WITH RECOMPILE
功能 LEN 和 SUBSTRING 的参数采用 SC 排序规则 采用 _SC 排序规则的字符串使用 UTF-16 编码。 在本机编译的存储过程内使用内置函数 LEN 和 SUBSTRING 时,这些函数不支持 UTF-16 编码。 使用其他排序规则或避免使用这些函数。
Feature 从专用管理员连接执行。 不能从专用管理员连接 (DAC) 执行本机编译的存储过程。 请改用常规连接。
Operation ALTER PROCEDURE 不能更改本机编译的存储过程。 要更改该过程定义,请删除并重新创建存储过程。
Operation 保存点 不能从具有活动保存点的事务调用本机编译的存储过程。 从事务中删除该保存点。
Operation ALTER AUTHORIZATION 不支持更改现有内存优化的表或本机编译的存储过程的所有者。 请删除并重新创建该表或过程来更改所有权。
操作员 OPENROWSET 不支持此运算符。 从本机编译的存储过程中删除 OPENROWSET
操作员 OPENQUERY 不支持此运算符。 从本机编译的存储过程中删除 OPENQUERY
操作员 OPENDATASOURCE 不支持此运算符。 从本机编译的存储过程中删除 OPENDATASOURCE
操作员 OPENXML 不支持此运算符。 从本机编译的存储过程中删除 OPENXML
操作员 CONTAINSTABLE 不支持此运算符。 从本机编译的存储过程中删除 CONTAINSTABLE
操作员 FREETEXTTABLE 不支持此运算符。 从本机编译的存储过程中删除 FREETEXTTABLE
Feature 表值函数 不能从本机编译的存储过程引用表值函数。 有可能解决此限制的一种方法是将表值函数中的逻辑添加到过程主体。
操作员 CHANGETABLE 不支持此运算符。 从本机编译的存储过程中删除 CHANGETABLE
操作员 GOTO 不支持此运算符。 使用其他过程构造,如 WHILE。
操作员 EXECUTE, INSERT EXEC 不支持嵌套本机编译的存储过程。 所需的操作可以内联指定作为存储过程定义的一部分。
操作员 OFFSET 不支持此运算符。 从本机编译的存储过程中删除 OFFSET
运算符 UNION 不支持此运算符。 从本机编译的存储过程中删除 UNION。 可以使用表变量将几个结果集合并为单个结果集。
操作员 INTERSECT 不支持此运算符。 从本机编译的存储过程中删除 INTERSECT。 在某些情况下,可以使用 INNER JOIN 获得相同的结果。
操作员 EXCEPT 不支持此运算符。 从本机编译的存储过程中删除 EXCEPT
运算符 OUTER JOIN 不支持此运算符。 从本机编译的存储过程中删除 OUTER JOIN。 有关详细信息,请参阅 实现外部联接
操作员 APPLY 不支持此运算符。 从本机编译的存储过程中删除 APPLY
操作员 PIVOT 不支持此运算符。 从本机编译的存储过程中删除 PIVOT
操作员 UNPIVOT 不支持此运算符。 从本机编译的存储过程中删除 UNPIVOT
运算符 OR, IN 本机编译的存储过程中查询的 WHERE 子句中不支持 Disjunction (OR, IN)。 为每种情况创建查询。
操作员 CONTAINS 不支持此运算符。 从本机编译的存储过程中删除 CONTAINS
操作员 FREETEXT 不支持此运算符。 从本机编译的存储过程中删除 FREETEXT
运算符 NOT 不支持此运算符。 从本机编译的存储过程中删除 NOT。 在某些情况下,可以使用不相等替换 NOT。 例如,可以使用 NOT a=b 替换 a!=b
操作员 TSEQUAL 不支持此运算符。 从本机编译的存储过程中删除 TSEQUAL
操作员 LIKE 不支持此运算符。 从本机编译的存储过程中删除 LIKE
操作员 NEXT VALUE FOR 不能在本机编译的存储过程内引用序列。 使用解释的 Transact-SQL 获取值,然后将其传递到本机编译的存储过程中。 有关详细信息,请参阅 在内存优化表中实现 IDENTITY
Set 选项 option 在本机编译的存储过程内无法更改 SET 选项。 可以使用 BEGIN ATOMIC 语句设置某些选项。 有关详细信息,请参阅 Natively Compiled Stored Procedures中有关原子块的章节。
操作数 TABLESAMPLE 不支持此运算符。 从本机编译的存储过程中删除 TABLESAMPLE
选项 RECOMPILE 在创建时编译本机编译的存储过程。 要重新编译本机编译的存储过程,请删除并重新创建它。 从过程定义中删除 RECOMPILE
选项 ENCRYPTION 不支持此选项。 从过程定义中删除 ENCRYPTION
选项 FOR REPLICATION 无法为复制创建本机编译的存储过程。 从过程定义中删除 FOR REPLICATION
选项 FOR XML 不支持此选项。 从本机编译的存储过程中删除 FOR XML
选项 FOR BROWSE 不支持此选项。 从本机编译的存储过程中删除 FOR BROWSE
联接提示 HASH、MERGE 本机编译的存储过程仅支持嵌套的循环联接。 不支持哈希和合并联接。 删除联接提示。
查询提示 查询提示 此查询提示不位于本机编译的存储过程内。 有关支持的查询提示,请参阅 Transact-SQL) (查询提示
选项 DISTINCT 不支持此选项。 从本机编译的存储过程中的查询删除 DISTINCT
选项 PERCENT TOP 子句不支持此选项。 从本机编译的存储过程中的查询删除 PERCENT
选项 WITH TIES TOP 子句不支持此选项。 从本机编译的存储过程中的查询删除 WITH TIES
聚合函数 聚合函数 不支持此子句。 有关本机编译的存储过程中聚合函数的详细信息,请参阅 Natively Compiled Stored Procedures
排名函数 排名函数 本机编译的存储过程中不支持排名函数。 从过程定义中删除它们。
函数 Function 不支持此函数。 从本机编译的存储过程中删除它。
语句 Statement 不支持此语句。 从本机编译的存储过程中删除它。
Feature MIN 和 MAX 用于二进制和字符串 聚合函数 MINMAX 不能用于本机编译的存储过程中的字符和二进制字符串值。
功能 不带聚合函数的 GROUP BY 在本机编译的存储过程中,当查询具有 GROUP BY 子句时,该查询也必须在 SELECT 或 HAVING 子句中使用聚合函数。 向查询中添加聚合函数。
Feature GROUP BY ALL 在本机编译的存储过程中,不能将 ALL 与 GROUP BY 子句一起使用。 从 GROUP BY 子句中删除 ALL。
Feature GROUP BY () 不支持按空列表分组。 删除 GROUP BY 子句,或在分组列表中加入列。
Feature ROLLUP 在本机编译的存储过程中,ROLLUP 不能与 GROUP BY 子句一起使用。 从过程定义中删除 ROLLUP
Feature CUBE 在本机编译的存储过程中,CUBE 不能与 GROUP BY 子句一起使用。 从过程定义中删除 CUBE
Feature GROUPING SETS 在本机编译的存储过程中,GROUPING SETS 不能与 GROUP BY 子句一起使用。 从过程定义中删除 GROUPING SETS
Feature BEGIN TRANSACTION、COMMIT TRANSACTION 和 ROLLBACK TRANSACTION 使用 ATOMIC 块控制事务和错误处理。 有关详细信息,请参阅 Atomic Blocks
Feature 内联表变量声明。 表变量必须引用显式定义的内存优化表类型。 应创建内存优化的表类型并将该类型用于变量声明,而不应在行内指定类型。
Feature sp_recompile 不支持重新编译本机编译的存储过程。 删除并重新创建过程。
功能 EXECUTE AS CALLER 必须有 EXECUTE AS 子句。 但不支持 EXECUTE AS CALLER。 使用 EXECUTE AS OWNEREXECUTE AS用户EXECUTE AS SELF
Feature 基于磁盘的表 无法从本机编译的存储过程中访问基于磁盘的表。 从本机编译的存储过程中删除对基于磁盘的表的引用。 或者,将基于磁盘的表转换为内存优化的表。
Feature 视图 无法从本机编译的存储过程中访问视图。 不引用视图,改为引用底层基表。
Feature 表值函数 无法从本机编译的存储过程中访问表值函数。 从本机编译的存储过程中删除对表值函数的引用。

访问内存优化表的事务

下表列出了可能出现在涉及访问内存优化表的事务的错误消息文本中的 Transact-SQL 功能和关键字,以及用于解决错误的纠正措施。

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

另请参阅

迁移到内存中 OLTP