如何在预脚本中更改 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 变量?的主要内容,如果未能解决你的问题,请参考以下文章