我可以从脚本内部启用 SQLCMD 模式吗?

ber*_*d_k 19 sql-server sqlcmd

是否有类似指令可以在脚本中使用以强制 SSMS 启用/禁用 SQLCMD 模式?

Dan*_*lan 20

已经说过了,没有办法。

然而,我们要做的一件事是在我们的脚本头中包含一个快速检查,以确定 SQLCMD 模式是否打开(如果没有,则终止脚本):

:setvar DatabaseName "MyDatabase"
GO
IF ('$(DatabaseName)' = '$' + '(DatabaseName)')
    RAISERROR ('This script must be run in SQLCMD mode. Disconnecting.', 20, 1) WITH LOG
GO
-- The below is only run if SQLCMD is on, or the user lacks permission to raise fatal errors
IF @@ERROR != 0
    SET NOEXEC ON
GO

PRINT 'You will only see this when SQLCMD mode is on'
-- Rest of script goes here

GO
SET NOEXEC OFF
GO
Run Code Online (Sandbox Code Playgroud)

使用 Severity 20 是有原因的,它倾向于立即GO终止连接,阻止运行更多脚本代码,即使脚本中稍后有批处理终止符。

严重性 20-24

指示系统问题并且是致命错误,这意味着正在执行语句或批处理的数据库引擎任务不再运行。任务记录有关发生的事情的信息,然后终止。在大多数情况下,与 数据库引擎 实例的应用程序连接也可能终止。如果发生这种情况,根据问题,应用程序可能无法重新连接。

此范围内的错误消息可能会影响访问同一数据库中数据的所有进程,并可能表明数据库或对象已损坏。严重性级别为 19 到 24 的错误消息将写入错误日志。

  • 如[此处](http://stackoverflow.com/a/8134305) 所述,您还可以将“SET NOEXEC ON”设置为附加的安全措施,以防止脚本中的其他任何内容运行。 (5认同)

gbn*_*gbn 8

不。

但是您始终可以在SQLCMD 模式下运行并在其中包含 T-SQL

为了明确区分 SQLCMD 命令和 Transact-SQL,所有 SQLCMD 命令都需要以冒号 (:) 为前缀。