- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用以下方式调用几个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
script 的代码中也可能有其他 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
再次没有提供所需的输出。
当您插入GO
时:setvar
之后在之前的例子中:
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
GO
PRINT $(LastInsertedID)
现在它会向您显示一条错误消息:Must declare the scalar variable @LastInsertedID
.
再次:setvar
不保存变量 @LastInsertedID
的实际值但此外还有对变量本身的引用,当然在给定的上下文中它不再存在。
我现在的问题是,如何使用:setvar
正确地或者我怎样才能以不同的方式解决这个问题并获得所需的输出?
感谢任何帮助或意见!
最佳答案
"Again :setvar does not save the actual value of the variable @LastInsertedID but furthermore a reference to the variable itself, which of course does not exist in that given context anymore."
Setvar 并不真正保存对变量的引用。 Setvar(和变量替换)是预处理器,因此它与在运行文件之前运行文本编辑器搜索和替换是一样的。
这可能会让事情变得更清楚。 SETVAR 和替换发生在其他事情之前。所以这个:
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
:setvar LastInsertedID @LastInsertedID
GO
PRINT $(LastInsertedID)
变成这样:
DECLARE @LastInsertedID int
SELECT @LastInsertedID = SCOPE_IDENTITY()
GO
PRINT @LastInsertedID
然后由 SQL Server 运行。这不起作用,因为在 GO 语句之后不再定义 @LastInsertedID。
Setvar 不能用于跨 GO block 保存值。每个 block 都有自己的作用域和自己的 SQL 变量集。您需要在同一个 GO block 中运行所有代码,或者找到另一种方法在两个不同的 block 之间传递数据(临时表?全局临时表?过程调用?)。
关于sql - 如何使用:setvar properly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580370/
我使用以下方式调用几个sql文件: :r C:\Scripts\Script1.sql :r C:\Scripts\Script2.sql :r C:\Scripts\Script3.sql 我对 :
当运行 SQLCMD.exe 并为脚本变量提供命令行参数时,我希望命令行上提供的值将覆盖 SQL 脚本文件中定义的值。 例如 给定以下 SQL 脚本: :setvar XXX "SQL script"
我正在尝试在 T-SQL 中创建一些脚本变量,如下所示: /* Deployment script for MesProduction_Preloaded_KLM_MesSap
我正在使用 SQLCMD 模式。我想设置 setvar 变量值。我应该如何设置 :setvar 中的值?我的代码如下所示: DECLARE @DatabaseName AS nvarchar(180)
我正在尝试使用 IEdmEnumeratorVariable5::SetVar 根据用户输入更新一些文件卡变量到 Windows 窗体。我的代码执行,没有错误消息,文件被 checkout 并重新 c
首先,我不是 DBA 并且我没有任何 SQL Server 的(管理员)经验,所以请在回答时使用少音节的词... 我正在运行 SQL Server 2008 R2 并尝试编写一个概念验证脚本来设置非分
我是一名优秀的程序员,十分优秀!