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


17

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

Answers:


17

如前所述,这是没有办法的。

但是,我们要做的一件事是在脚本头中进行快速检查,以确定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 not see this unless SQLCMD mode is on'
-- Rest of script goes here

GO
SET NOEXEC OFF
GO

使用严重性20是有原因的,它会立即GO终止连接,即使脚本中稍后有批处理终止符,也可能阻止脚本代码的运行。

严重级别20-24

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

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


对于ssms,前两行就足够了;对于sql 2000 Query Analyzer,它行得通,但不会显示该消息。
bernd_k 2011年

但是脚本不会只是从下一个GO继续执行吗?
丹·诺兰

我使用的是SSMS 2008 R2,两行产生:Meldung 102,Ebene 15,Status 1,Zeile 1':'附近的语法不正确。使用SQL Server 2000查询分析器,您需要使用RAISERROR。
bernd_k 2011年

4
如前所述在这里,你还可以设置SET NOEXEC ON作为一个附加的安全措施,以防止其他任何脚本运行。
雅虎(Yahoo)2013年

嗯,这是使用SQLCMD模式来查明SQLCMD模式是否处于打开状态...我想说的是,关闭SQLCMD模式时它将无法正常工作,如@bernd_k所经历的那样。但是,如果:setvar被删除/替换为SQL,它将起作用。
Oak_3260548 '19

7

没有。

但是,您始终可以在SQLCMD模式下运行,但可以使用T-SQL

为了清楚地区分SQLCMD命令和Transact-SQL,所有SQLCMD命令都必须以冒号(:)开头。


这对于SQL Server 2012/2014/2016仍然有效吗?
约翰aka hot2use

1
@ hot2use:是的,我已经用它在2016分之2014
GBN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.