我使用以下方法调用几个 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
如何正确使用,或者如何以不同的方式解决这个问题?
我感谢任何帮助或输入!