【问题标题】:A fatal scripting error occurred. Variable is not defined发生致命的脚本错误。变量未定义
【发布时间】:2018-04-17 07:33:05
【问题描述】:

当我在 SSMS 2017 和 SQL Server DB 中以 SQLCMD 模式运行此查询时。它工作正常。

--SQLCMD mode
--DECLARE Global variables
:SETVAR daysBack  -1
SELECT $(daysBack)

结果:-1

如果我只运行 1 行

SELECT $(daysBack)

在同一连接上的同一窗口中,或在另一个选项卡中。我收到错误

发生了致命的脚本错误。 变量 daysBack 未定义。

为什么我会出错?

以及如何使我的变量全局化,例如

SELECT '$(COMPUTERNAME)'

【问题讨论】:

    标签: sql sql-server ssms sqlcmd


    【解决方案1】:

    我不认为你可以。 SQLCMD 变量是一种客户端工具技巧,它们并不真正作为 SQL Server 概念存在。

    当您提交新批次时,连接和服务器不知道它们的存在,并且系统不会保留先前批次中使用的变量的知识。

    来自sqlcmd - Use with Scripting Variables

    如果不止一种类型的变量具有相同的名称,则使用具有最高优先级的变量。

    1. 系统级环境变量

    2. 用户级环境变量

    3. 在启动 sqlcmd 之前在命令提示符处设置命令 shell (SET X=Y)

    4. sqlcmd -v X=Y

    5. :Setvar X Y

    其中,前三个有效地取自启动特定进程时,除非该进程具有允许编辑环境变量的特定工具。 SSMS 和 SQLCMD 都没有这样的功能,因此一旦工具已经运行,您就无法在这些类别中创建变量。

    第四个是特定于 SQLCMD 的,在 SSMS 中没有等效项。只剩下最后一个(使用:setvar),这不会创建“全局”变量(实际上只是环境变量和 SQLCMD 内置变量)。

    【讨论】:

    • $(COMPUTERNAME) 为所有查询共享。
    • @justromagod - $(COMPUTERNAME) 正在访问 COMPUTERNAME 环境变量。环境变量需要在启动客户端工具之前设置,并在执行期间固定。无法从 SSMS 窗口中更改或创建新的环境变量。
    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2013-01-29
    相关资源
    最近更新 更多