我使用以下方法调用几个 sql 文件:
:r C:\Scripts\Script1.sql
:r C:\Scripts\Script2.sql
:r C:\Scripts\Script3.sql
:r我对来自这里的调用有这个想法: TransactSQL to run another TransactSQL script。该Script1.sql脚本也可能在其代码中还有其他 sql 脚本调用等。
但现在我想为每个脚本定义设置。例如:我在调用之前定义LastInsertedID并将其设置为. 这个脚本现在使用这个变量并使用它。SCOPE_IDENTITY()Script1.sql
为此,我使用了 sqlcmd 脚本变量(http://msdn.microsoft.com/de-de/library/ms188714.aspx)并使用以下方法设置它们:
:setvar LastInsertedID SCOPE_IDENTITY()
然后我可以写SELECT $(LastInsertedID进去Script1.sql,它会给我正确的值。
后来我发现这根本不正确,因为如果您INSERT在选择之前处理其他语句$(LastInsertedID),它将为您提供新插入行的 ID。可能是这种情况,因为:setvar不保存该电流的值,SCOPE_IDENTITY()而是保存对它的引用,并在请求时再次调用它。
所以我尝试了一些不同的方法并声明了一个变量,为其分配了当前值,SCOPE_IDENTITY()然后将其保存为:setvar. 它看起来像这样:
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
PRINT $(LastInsertedID)
这再次起作用并提供了正确的结果。但后来我将我的代码分成多个GO部分,并意识到:setvar再次提供的不是所需的输出。
当您在之前的示例中插入 aGO之后::setvar
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
GO
PRINT $(LastInsertedID)
它现在给你一个错误信息说:Must declare the scalar variable @LastInsertedID。
再次:setvar不保存变量的实际值,@LastInsertedID而是对变量本身的引用,这当然不再存在于给定的上下文中。
我现在的问题是,我该:setvar如何正确使用,或者如何以不同的方式解决这个问题?
我感谢任何帮助或输入!