【问题标题】:How to set a variable in SQLCMD mode after running a SQL statement?运行 SQL 语句后如何在 SQLCMD 模式下设置变量?
【发布时间】:2015-01-09 20:18:39
【问题描述】:

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

【问题讨论】:

  • 你不能那样做。该脚本分两个阶段运行。首先:SQLCMD 东西运行。然后 T-SQL 运行。当@MYVARIABLE 存在时,MYVARIABLE 不存在。

标签: sql-server sqlcmd


【解决方案1】:

如果你可以使用普通的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 进行变量替换的 hack。
  • /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 命令,否则您会覆盖命令行设置,但我可能是错的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多