如何在预脚本中更改SSDT SQLCMD变量?

时间:2015-05-06 13:37:42

标签: sql-server sql-server-data-tools sqlcmd

我试图找出如何动态更改SQLCMD变量,但我无法使其正常工作。

目标是从SELECT获取值并使用该值分配SQLCMD变量。

我试过了:

1)

:servar myVariable 
SELECT @myVariable = 1

2)尝试将文件的值设置为:OUT,但它表示:

  

错误1 72006:致命脚本错误:不支持命令输出。

3 个答案:

答案 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文章中查看更多内容。