有条件地在脚本文件中设置SQLCMD变量吗?

时间:2019-09-04 09:50:52

标签: sql-server tsql sqlcmd

我需要根据计算机名称有条件地设置SQCMD脚本变量。

我有一个如下的SQLCMD命令

sqlcmd  -U "username" -S "ipaddr" -P "password" -i "scriptname"

在脚本脚本名称中,我要实现的伪代码是:

IF SERVERPROPERTY('MachineName') = "X"
  :setvar USER User1
ELSE
  :setvar USER User2

使得USER可以在后续语句中作为$(USER)使用,当前在许多现有代码行中使用

我不会列出所有失败的尝试,但是我无法获得将SQLCMD与TSQL混合使用的正确语法。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

在将批处理发送到SQL Server进行执行之前,该工具会分配SQLCMD变量值。因此,不可能使用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操作出现问题。我建议-我总是被指定。