如何更改 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 变量。
我正在尝试找出如何即时更改 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 变量。