【问题标题】:SQL Server SSDT publish fails thinking a PowerShell command is using a SQLCMD variableSQL Server SSDT 发布失败,认为 PowerShell 命令正在使用 SQLCMD 变量
【发布时间】:2017-04-05 19:06:33
【问题描述】:

我的 SSDT 数据库发布失败,因为它错误地认为嵌入的字符串引用了 SQLCMD 变量:

EXEC xp_cmdshell 'powershell.exe $(Get-Date).IsDaylightSavingTime()'

我可以手动运行此语句(在 SSMS 中)并获得所需的结果(令人遗憾的是“真实”),但发布阻塞试图解析该语句:

SQL 执行错误:发生致命错误。找不到变量 Get-Date。

SQL 执行错误:发生致命错误。解析 EXEC xp_cmdshell 'powershell.exe $(Get-Date).IsDaylightSavingTime()' 时遇到不正确的语法。

如何在不对其进行混淆或将其添加到数据库项目中的 SQLCMD 变量列表中的情况下使该语句不会导致发布失败?

(或者也许有一种更简单的方法来检查服务器的时区是否遵守 Godforsaken DST?美国的时区标识符说“标准”,无论是否真的在我们的开发人员机器上流行。并且从 GETDATE() 更改所有引用GETUTCDATE() 是不可行的。)

【问题讨论】:

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


    【解决方案1】:

    以前没见过,但我从来没有尝试过从 t-sql 调用 powershell :)。

    最简单的方法是使用以下方式拆分传递给 xp_cmdshell 的字符串:

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4a07d229-7972-41d1-bd90-ffa979bc7069/how-to-escape-string-that-sqlcmd-thinks-is-a-variable-but-isnt?forum=transactsql

    ' + CHAR(36) + '

    是一个没有 powershell 的更简单的解决方案,不确定我是否可以设想在 t-sql 上要做的更痛苦的事情,抱歉 :)

    【讨论】:

    • 这行得通(尽管以一种混淆的方式,最好只做'$' + '(stuff)'),但它必须设置在一个变量中,它是一个 VARCHAR(也不是 VARCHAR (MAX) 但长度有限)。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2013-04-13
    • 2014-04-15
    • 2010-10-22
    • 2023-03-20
    • 2012-09-05
    相关资源
    最近更新 更多