如何在运行SQL语句后在SQLCMD模式下设置变量?

时间:2015-01-09 20:18:40

标签: sql-server sqlcmd

我正在尝试在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)?

1 个答案:

答案 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命令,否则你会覆盖命令行设置,但我可能是错的。