请求确认:内存优化存储过程中能否使用Table Variable?
内存优化存储过程中能否使用表变量?
你说得完全没错——原生编译的内存优化存储过程确实不支持常规表变量,和官方文档的说明一致。
你给出的这段常规表变量声明代码:
DECLARE @tvTableD TABLE ( Column1 INT NOT NULL , Column2 CHAR(10) );
如果放到原生编译的存储过程里执行,会直接触发错误,因为这类存储过程对T-SQL的语法构造有严格限制,常规表变量不在支持列表中。
替代方案:使用内存优化表类型
如果需要在内存优化存储过程里实现临时数据存储的需求,你可以用内存优化的用户定义表类型来替代常规表变量,步骤如下:
- 先创建一个内存优化的表类型:
CREATE TYPE dbo.MemoryOptimizedTableType AS TABLE ( Column1 INT NOT NULL, Column2 CHAR(10), INDEX IX_Column1 HASH (Column1) WITH (BUCKET_COUNT = 1000) ) WITH (MEMORY_OPTIMIZED = ON);
- 然后在原生编译存储过程中声明该类型的变量并使用:
CREATE PROCEDURE dbo.NativelyCompiledProc WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English' ) DECLARE @tvTableD dbo.MemoryOptimizedTableType; -- 可以正常对这个变量进行插入、查询等操作 INSERT INTO @tvTableD (Column1, Column2) VALUES (1, 'TestData'); SELECT Column1, Column2 FROM @tvTableD; END;
这种内存优化的表类型变量不仅能满足临时存储的需求,还能匹配内存优化存储过程的高性能设计目标。
内容的提问来源于stack exchange,提问作者Magendran V
相关产品推荐
相关产品推荐

