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

从WiX使用SQLCMD执行二进制SQL文件

部署 SQL SSDT 项目时如何跟踪数据更改

路径中的 SQLCMD 变量

部署 DacPac 时如何在 SqlPackage.exe 中使用多个 SQLCMD 变量?

适用于 Oracle 数据库的 SSDT 等效项

Visual Studio:使用 SQLCMD 变量在部署时更改数据库类型