如何更改 pre-script 中的 SSDT SQLCMD 变量?

How to change SSDT SQLCMD variable in pre-script?

我正在尝试找出如何即时更改 SQLCMD 变量,但我无法让它工作。

目标是从 SELECT 中获取值并将该值分配给 SQLCMD 变量。

我试过:

1)

:servar myVariable 
SELECT @myVariable = 1

2) 试图用 :OUT 放置文件的值,但它说:

Error 1 72006: Fatal scripting error: Command Out is not supported.

您需要声明一个临时 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

的回答:

酷!只是要注意一个陷阱:

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 文章中查看更多信息。

这是不可能的。 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 变量。