2012-11-08 53 views
1

我有一个很大的T-SQL脚本来打开和关闭一些事务。我已经读过,用GO语句提交批处理可以清除所有变量的范围。SQL服务器事务中的变量持久性

鉴于下面的脚本,在事务提交后会定义@MyImportantVariable吗?

这是一个问题,如果是的话,我该如何克服它?

DECLARE @MyImportantVariable INT; 
SET @MyImportantVariable = 42; 

DECLARE @Counter INT; 
SET @Counter = 0 

DECLARE UpdateGarmentCursor CURSOR FAST_FORWARD 
FOR 
SELECT 
     MyColumn 
    FROM 
     MyWonderfulTable 

BEGIN TRANSACTION 
    WHILE @@TRAN_STATUS = 0 
    BEGIN 
     -- Do interesting work in here 
    SET @Counter = @Counter +1 
    IF(@Counter>10) 
    BEGIN 
     COMMIT TRANSACTION 
      -- What happens here to @MyImportantVariable? 
      SET @Counter = 0 
     BEGIN TRANSACTION 
    END 
END 

-- Close the transaction one last time 
COMMIT TRANSACTION 

回答

2

该变量仍然存在。

您的示例不包含GO命令,仅包含事务。

GO指示批次的结束 ...批次和事务完全是两个不同的事情。

From MSDN

GO不是Transact-SQL语句;它是由 sqlcmd和osql实用程序和SQL Server Management Studio代码 编辑器识别的命令。

SQL Server实用程序将GO解释为应将当前批次的Transact-SQL语句发送到SQL 服务器的实例的信号 。当前的一批语句由自上次GO或自特设会话开始以来输入的所有语句 组成,或者如果这是第一个GO,则由 脚本输入。