如何在预脚本中更改 SSDT SQLCMD 变量?
Posted
技术标签:
【中文标题】如何在预脚本中更改 SSDT SQLCMD 变量?【英文标题】:How to change SSDT SQLCMD variable in pre-script? 【发布时间】:2015-05-06 13:37:41 【问题描述】:我正在尝试找出如何即时更改 SQLCMD 变量,但无法正常工作。
目标是从 SELECT 中获取值并将该值分配给 SQLCMD 变量。
我试过了:
1)
:servar myVariable
SELECT @myVariable = 1
2) 尝试将文件的值放在 :OUT 中,但它说:
错误 1 72006:致命脚本错误:不支持命令输出。
【问题讨论】:
我的 2 美分:***.com/questions/13183203/… 【参考方案1】:你需要声明一个临时的 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
【讨论】:
这里没有从 SQL 变量初始化 sqlcmd 变量。【参考方案2】:这是不可能的。 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 变量。
【讨论】:
【参考方案3】:回复https://***.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 文章中查看更多信息。
【讨论】:
您在发布时是否在 SSDT 中尝试过?或者只是在 SSMT 中启用了 SQLCMD 模式?很明显,在 GO 之后 temp 变量消失了 你是对的!我仅在 SSMT 中对其进行了测试。我将检查 SSDT。谢谢。以上是关于如何在预脚本中更改 SSDT SQLCMD 变量?的主要内容,如果未能解决你的问题,请参考以下文章