我正在尝试在SQL语句中查找变量,然后从中设置SQLCMD模式变量。像这样:
:setvar MYVARIABLE "1"
DECLARE @MYVARIABLE int
SELECT @MYVARIABLE=col1 FROM mytable WHERE ID=1
-- This line is wrong
SET $(MYVARIABLE) = @MYVARIABLE
SELECT * FROM another_table WHERE ID = $(MYVARIABLE)
我知道我可以这样做:
SELECT * FROM another_table WHERE ID = @MYVARIABLE
问题是现有一些代码使用了$(MYVARIABLE)
,我试图不要触及。
如何在运行SQL代码后设置$(MYVARIABLE)?
答案 0 :(得分:0)
如果您可以使用普通的cmd.exe
,则可以执行以下操作:
for /F "usebackq" %M in (`sqlcmd -S yourserver -d yourdatabase -E -W -h -1 -Q "SET NOCOUNT ON ; SELECT TOP (1) col1 FROM mytable WHERE ID = 1"`) do sqlcmd -S yourserver -d yourdatabase -E -v MYVARIABLE=%M -i TheRestOfYourScript.sql
解释for
声明:
for
是从cmd.exe
执行变量替换的黑客。/F
是用于解析的命令行开关。"usebackq"
允许稍后出现的反引号语法。%M
存储输出。它只需要一个字母。如果您最终将命令放在.bat脚本中,则需要改为%%M
(或者您选择的其他任何字母)。解释第一个sqlcmd
声明:
-S yourserver
和-d yourdatabase
可能与原始sqlcmd
调用中的内容相同。-E
是受信任的身份验证。如果您使用其他一些身份验证方法,请将-E
替换为您正在使用的任何方式。-W
从结果中删除了前导和尾随空格。-h -1
删除了标题行。-Q
表示"运行此命令并退出。" SET NOCOUNT ON
会阻止(1 row affected)
消息,您无需尝试解析该消息。
第二个sqlcmd
语句使用-v MYVARIABLE=%M
来设置脚本中的值。我相信这意味着你不需要在你的脚本中使用:setvar
命令,否则你会覆盖命令行设置,但我可能是错的。