gpt4 book ai didi

sql - 如何使用:setvar properly?

转载 作者:行者123 更新时间:2023-12-02 23:21:54 27 4
gpt4 key购买 nike

我使用以下方式调用几个sql文件:

:r C:\Scripts\Script1.sql
:r C:\Scripts\Script2.sql
:r C:\Scripts\Script3.sql

我对 :r 有这样的想法从这里调用:TransactSQL to run another TransactSQL scriptScript1.sql script 的代码中也可能有其他 sql 脚本调用,等等。

但现在我想为每个脚本定义设置。例如:我定义LastInsertedID并将其设置为值 SCOPE_IDENTITY()就在调用 Script1.sql 之前。现在这个脚本使用这个变量并使用它。

为此,我使用了 sqlcmd 脚本变量 ( http://msdn.microsoft.com/de-de/library/ms188714.aspx ) 并使用以下方法设置它们:

:setvar LastInsertedID SCOPE_IDENTITY()

然后我可以写 SELECT $(LastInsertedIDScript1.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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com