我试图找出如何动态更改SQLCMD变量,但我无法使其正常工作。
目标是从SELECT获取值并使用该值分配SQLCMD变量。
我试过了:
1)
:servar myVariable
SELECT @myVariable = 1
2)尝试将文件的值设置为:OUT,但它表示:
错误1 72006:致命脚本错误:不支持命令输出。
答案 0 :(得分:3)
您需要声明一个临时的sql @variable并从select中分配它。
然后使用sql @variable初始化sqlcmd变量。
DECLARE @sqlVar CHAR(1)
SELECT @sqlVar = '1'
:setvar myVar @sqlVar
SELECT $(myVar) as value
SELECT @sqlVar = '2'
:setvar myVar @sqlVar
SELECT $(myVar) as value
答案 1 :(得分:3)
这是不可能的。在将脚本发送到服务器之前,SQLCMD只是一个预处理器。
你接受的答案有点令人困惑。
它实际上并没有以任何有意义的方式实时分配给SQLCMD
变量。
:setvar myVar @sqlVar
只需指定字符串" @sqlVar"到SQL Cmd变量(不必要和误导两次)。然后,此字符串将用于替换为$(myVar)
的字符串。
所有这些都发生在脚本被发送到服务器之前(显然在执行开始之前并且为SQL变量分配了任何值)
将所有$(myVar)
替换为@sqlVar
后脚本的结果如下所示。
这就是发送到服务器的内容。
DECLARE @sqlVar CHAR(1)
SELECT @sqlVar = '1'
SELECT @sqlVar as value
SELECT @sqlVar = '2'
SELECT @sqlVar as value
根本没有对SQLCMD变量进行动态分配。唯一的赋值是SQL变量。
答案 2 :(得分:0)
回答https://stackoverflow.com/a/30086248/623190:
酷!只是意识到一个陷阱:
DECLARE @sqlVar CHAR(1)
SELECT @sqlVar = '1'
:setvar myVar @sqlVar
SELECT $(myVar) as value
GO
-- SELECT @sqlVar = '2'
-- :setvar myVar @sqlVar
SELECT $(myVar) as value
结果:
Msg 137, Level 15, State 2, Line 6
Must declare the scalar variable "@sqlVar".
如果我们不能将SQLCMD变量的值超过GO(当它由常规变量赋值时),那么在批次中使用SQLCMD变量是没有意义的。
与有效的代码比较:
:setvar myVar '1'
SELECT $(myVar) as value
GO
SELECT $(myVar) as value
这神奇地起作用:
:OUT C:\Temp\SetVarTest.sql
declare @command varchar(100) = ':SETVAR myVar ' + cast((select count(*) from sys.objects) as varchar(10));
PRINT @command
GO
:OUT stdout
:r C:\Temp\SetVarTest.sql
GO
PRINT $(myVar)
在Hacking SQLCMD Mode文章中查看更多内容。