用户定义的类型变量不清除事务内的值

时间:2012-03-09 17:14:16

标签: sql sql-server-2008

我有在事务中使用临时用户定义类型变量的方案,但临时变量没有清除事务中的值。

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

对于上述查询,输出为

Actually it has to return only the record for 2, but it is not clearing the value once it is initialized. Please guide me to proceed further.

实际上它必须只返回2的记录,但是一旦初始化它就不会清除它。请指导我继续。

2 个答案:

答案 0 :(得分:2)

数据类型的声明不会清除表的内容。一旦表变量存在,它将包含您放入的任何内容。代码的执行甚至不必传递声明变量的位置。这也可以。

 if 0 = 1
 begin
   DECLARE @table [int_list_table]
 end 

您只需要确保声明是在对变量的任何引用之前。

要修复代码,使其完成您想要的操作,您当然可以在插入语句之前添加delete from @table

答案 1 :(得分:1)

来自documentation on TSQL variables;

  

变量的范围从声明的点开始持续到   声明它的批处理或存储过程的结束。

由于您的整个示例就我所说的是一个批处理,因此您的@table变量永远不会超出范围,因此会保留其值直到批处理结束。