我打电话用几个SQL文件:如何正确使用setvar?
: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
,并在Script1.sql
的呼叫之前将其设置为值SCOPE_IDENTITY()
。这个脚本现在使用这个变量并且与它一起工作。
要做到这一点我用的sqlcmd脚本变量(http://msdn.microsoft.com/de-de/library/ms188714.aspx),并通过设置它们:
:setvar LastInsertedID SCOPE_IDENTITY()
然后我可以写在Script1.sql
SELECT $(LastInsertedID
和它会给我正确的值。
后来我发现这是不正确的,因为如果您在选择$(LastInsertedID)
之前先处理其他INSERT
声明,它会为您提供新插入行的ID。这可能是这种情况,因为:setvar
不保存当前的SCOPE_IDENTITY()
的值,而是对其进行引用,并在请求后再次调用它。
所以我尝试了一些不同的东西,并声明了一个变量,将其赋值为当前值SCOPE_IDENTITY()
,然后用:setvar
保存。它看起来像这样:
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
PRINT $(LastInsertedID)
这再次工作,并提供了正确的结果。但后来我把我的代码分成了多个GO
部分,并意识到:setvar
再次提供不了所需的输出。
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
GO
PRINT $(LastInsertedID)
现在给你一个错误消息说:Must declare the scalar variable @LastInsertedID
当你插入之前的例子中的:setvar
后GO
。
再次:setvar
不保存变量@LastInsertedID
的实际值,但此外还引用了变量本身,当然在该给定的上下文中不再存在。
我现在的问题是,我该如何恰当地使用:setvar
或者我如何以期望的输出方式解决这个问题?
我感谢任何帮助或输入!
我想设置一些值,然后使用这些值运行脚本。例如:将id设置为1,运行脚本,该脚本为ID为1的条目插入一些附加数据。稍后重新使用它,并将id设置为2.所以基本上是一个简单的函数调用,但带有脚本文件。 –
这样做。你可以像':setvar ID 1'那样做,然后在脚本的SQL部分执行'insert into dbo.tbl($(ID))'或者将它分配给一个SQL变量(例如@id)。对于所有意图和目的,在运行时将$(ID)视为由sqlcmd替换为变量值的静态文本。 –
啊...我以为你想要帮助。成为一个屁股不是一个很好的方法来实现这一目标。也就是说,SQL变量填充您尝试使用sqlcmd变量填充的角色。为什么,特别是,你觉得你需要分配一个sqlcmd变量?你想用sqlcmd变量来完成什么,你不能使用SQL变量? –