我有在事务中使用临时用户定义类型变量的方案,但临时变量没有清除事务中的值。
CREATE TYPE [int_list_table] AS TABLE([item_id] [int] NULL)
GO
DECLARE @int_val BIGINT
-- Create a Temp table with 5 rows
;WITH TEMP(int_val)
AS
(SELECT 1
UNION ALL
SELECT int_val = 1 + int_val FROM TEMP WHERE int_val < 5
)SELECT * INTO #int FROM TEMP;
SET NOCOUNT ON
DECLARE IntCursor CURSOR FAST_FORWARD FOR
SELECT int_val FROM #int
OPEN IntCursor
FETCH NEXT FROM IntCursor INTO @int_val
WHILE(@@FETCH_STATUS = 0)
BEGIN
BEGIN TRY
BEGIN TRANSACTION
-- a temprory table to store the integer value
DECLARE @table [int_list_table]
INSERT INTO @table
SELECT 1 WHERE 2 = @int_val
-- Actually @table should have resultset only at @int_val = 2, But once it filled with values even for 3 and 4
SELECT
'User Table Type Value' = item_id,
'Loop Integer Value' = @int_val
FROM
@table
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
FETCH NEXT FROM IntCursor INTO @int_val
END
CLOSE IntCursor
DEALLOCATE IntCursor
SET NOCOUNT OFF
对于上述查询,输出为
实际上它必须只返回2的记录,但是一旦初始化它就不会清除它。请指导我继续。
答案 0 :(得分:2)
数据类型的声明不会清除表的内容。一旦表变量存在,它将包含您放入的任何内容。代码的执行甚至不必传递声明变量的位置。这也可以。
if 0 = 1
begin
DECLARE @table [int_list_table]
end
您只需要确保声明是在对变量的任何引用之前。
要修复代码,使其完成您想要的操作,您当然可以在插入语句之前添加delete from @table
。
答案 1 :(得分:1)
来自documentation on TSQL variables
;
变量的范围从声明的点开始持续到 声明它的批处理或存储过程的结束。
由于您的整个示例就我所说的是一个批处理,因此您的@table
变量永远不会超出范围,因此会保留其值直到批处理结束。