我需要根据计算机名称有条件地设置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混合使用的正确语法。
我该如何实现?
答案 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操作出现问题。我建议-我总是被指定。