有条件地在脚本文件中设置 SQLCMD 变量?
Conditionally set a SQLCMD variable in a scriptfile?
我需要根据机器名称有条件地设置 SQCMD 脚本变量。
我有一个SQLCMD命令如下
sqlcmd -U "username" -S "ipaddr" -P "password" -i "scriptname"
在脚本scriptname中,我要实现的伪代码是:
IF SERVERPROPERTY('MachineName') = "X"
:setvar USER User1
ELSE
:setvar USER User2
以便 USER 可以在后续语句中用作 $(USER),目前在许多现有代码行中
我不会列出所有失败的尝试,但我无法获得混合 SQLCMD 和 TSQL 的正确语法。
我怎样才能做到这一点?
SQLCMD 变量值由工具在批处理发送到 SQL 服务器执行之前分配。因此,无法使用 T-SQL(在服务器上运行)有条件地或以其他方式设置值。
一种解决方法是调用 SQLCMD 两次,一次是使用 T-SQL 创建 SETVAR
命令并将其通过管道传输到客户端上的文件,然后执行使用“:r”SQLCMD 命令包含文件的最终脚本。示例(可以封装在 OS 命令文件中):
sqlcmd -U "username" -S "ipaddr" -P "password" -I -Q"IF SERVERPROPERTY('MachineName') = 'X' PRINT ':setvar USER User1' ELSE PRINT ':setvar USER User1';" >"C:\Scripts\setvarcommands.sql"
sqlcmd -U "username" -S "ipaddr" -P "password" -I -i "C:\Scripts\scriptname.sql"
c 的内容:\Scripts\scriptname.sql:
:r "C:\Scripts\setvarcommands.sql"
PRINT '$(USER)';
可能有更优雅的方法来创建 setvarcommands.sql 但这是第一个想到的。
请注意,我指定了 -I
SQLCMD 参数,以便 QUOTED_IDENTIFIERS ON
用于脚本执行。为了向后兼容,默认值为 OFF,并且可能会导致某些 DDL 或 DML 操作出现问题。我建议 -I' 始终被指定。
我需要根据机器名称有条件地设置 SQCMD 脚本变量。
我有一个SQLCMD命令如下
sqlcmd -U "username" -S "ipaddr" -P "password" -i "scriptname"
在脚本scriptname中,我要实现的伪代码是:
IF SERVERPROPERTY('MachineName') = "X"
:setvar USER User1
ELSE
:setvar USER User2
以便 USER 可以在后续语句中用作 $(USER),目前在许多现有代码行中
我不会列出所有失败的尝试,但我无法获得混合 SQLCMD 和 TSQL 的正确语法。
我怎样才能做到这一点?
SQLCMD 变量值由工具在批处理发送到 SQL 服务器执行之前分配。因此,无法使用 T-SQL(在服务器上运行)有条件地或以其他方式设置值。
一种解决方法是调用 SQLCMD 两次,一次是使用 T-SQL 创建 SETVAR
命令并将其通过管道传输到客户端上的文件,然后执行使用“:r”SQLCMD 命令包含文件的最终脚本。示例(可以封装在 OS 命令文件中):
sqlcmd -U "username" -S "ipaddr" -P "password" -I -Q"IF SERVERPROPERTY('MachineName') = 'X' PRINT ':setvar USER User1' ELSE PRINT ':setvar USER User1';" >"C:\Scripts\setvarcommands.sql"
sqlcmd -U "username" -S "ipaddr" -P "password" -I -i "C:\Scripts\scriptname.sql"
c 的内容:\Scripts\scriptname.sql:
:r "C:\Scripts\setvarcommands.sql"
PRINT '$(USER)';
可能有更优雅的方法来创建 setvarcommands.sql 但这是第一个想到的。
请注意,我指定了 -I
SQLCMD 参数,以便 QUOTED_IDENTIFIERS ON
用于脚本执行。为了向后兼容,默认值为 OFF,并且可能会导致某些 DDL 或 DML 操作出现问题。我建议 -I' 始终被指定。