【问题标题】:How to change SSDT SQLCMD variable in pre-script?如何在预脚本中更改 SSDT SQLCMD 变量?
【发布时间】:2015-05-06 13:37:41
【问题描述】:

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

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

我试过了:

1)

:servar myVariable 
SELECT @myVariable = 1

2) 尝试将文件的值放在 :OUT 中,但它说:

错误 1 ​​72006:致命脚本错误:不支持命令输出。

【问题讨论】:

标签: sql-server sql-server-data-tools sqlcmd


【解决方案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://stackoverflow.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。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2021-11-15
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2012-09-18
    • 2021-11-18
    相关资源
    最近更新 更多