在SQL Server Management Studio中,什么是SQLCMD模式?

68

在SQL Server Management Studio中,我想知道什么是SQLCMD模式?


3
请参考SQLCMD工作台,其中提供了一些使用此功能的示例。 - Martin Smith
以及dba.se:http://dba.stackexchange.com/search?q=sqlcmd - gbn
4个回答

90

我进行了更深入的研究,下面是我对此的理解,以扩展迄今为止所写的内容:

什么是SQLCMD

SQLCMD.exe是SQL Server 2005及更高版本安装包中包含的控制台实用程序。通常可以在类似于c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE的路径下找到它。

它是一个简单的脚本环境,允许自动化与SQL服务器相关的任务。例如,您可以编写并执行一个脚本,将登录到特定的SQL Server实例,从给定目录上的此连接执行脚本,并将输出存储在指定的文件中。

Invoke-Sqlcmd命令提供了一种标准化、基于Powershell的方法来替换这个工具,并保留大部分原始语法和功能,该命令在SQL Server 2008中被引入。

什么是SSMS中的SQLCMD模式

在SSMS中,SQLCMD模式是一种脚本执行模式,模拟了sqlcmd.exe环境,因此接受一些不属于T-SQL语言的命令。 与sqlcmd.exe不同,它使用SqlClient(与SSMS相同的方式)而不是ODBC数据提供程序来联系数据库,因此在某些方面它可能会有不同的行为。

在SQLCMD模式下执行脚本允许使用典型的sqlcmd.exe环境命令。但是,SQLCMD模式没有IntelliSense或调试支持,因此维护混合了清洁的T-SQL和SQLCMD特定代码的脚本可能会很麻烦。因此,只有在必要时才应使用它。

示例用例

假设一个公司对包含环境名称的数据库具有命名约定,例如:MyDb_ProdMyDb_TestMyDb_Dev。这个约定可能被用来最小化错误的机会

当开发人员编写T-SQL脚本时,它将在部署/测试过程中在不同的环境中执行,这将需要许多代码版本:

 SELECT *
 FROM [MyDb_Dev].[dbo].[MyTable1] -- MyDb_Dev -> MyDb_Test -> MyDb_Prod

相反,我们可以假设数据库名称将在部署过程中作为SQLCMD变量提供,并且完全相同的文件将部署到所有环境中:

 -- :setvar databaseName "MyDb_Dev" -- uncomment for testing in SSMS

 SELECT *
 FROM [$(databaseName)].[dbo].[MyTable1]

(在这个简单的例子中可以完全省略数据库名称,但如果您有跨数据库联接,则使用数据库名称是必要的)


5
谢谢,@buli。这个答案是唯一一个解释为什么一个通常只使用SSMS中的TSQL的人可能选择创建和运行SQLCMD脚本的答案。 - BradC
我正在考虑的一个使用案例是:对于可用性组,您当然要使用多个服务器。应该可以编写T-SQL查询系统表以获取有关AG健康状况的信息,但这需要您分别连接到每个副本并查询它。给定的副本可以为您提供组中所有副本的名称 - 因此,您应该能够在任何副本上运行脚本,获取所有副本的列表,然后动态地针对每个副本执行健康检查查询,而无需硬编码服务器名称。 - youcantryreachingme

20

这就是它的字面意思。

这是一种可以让你撰写SQLCMD脚本的模式。

来自MSDN - 使用查询编辑器编辑SQLCMD脚本:

要使用数据库引擎查询编辑器编写或编辑SQLCMD脚本,必须启用SQLCMD脚本模式。

在SQL Server Management Studio中,通过“查询”菜单(查询->SQLCMD模式)设置此选项。


7
显然不是我,但很多资源并没有真正阐明在使用SQLCMD和仅在Management Studio中运行一些T-SQL语句之间的区别。上周Visual Studio为我生成的一个转换脚本会检查SQLCMD是否启用,如果没有启用,则会拒绝运行;在Management Studio的查询菜单中似乎有一个启用/禁用选项。因此,存在差异,但很多资源基本上只是说SQLCMD是一种伟大、神奇的设备,可以运行T-SQL语句和批处理,并就此结束。 - Panzercrisis
28
这个答案使用SQLCMD来解释SQLCMD,基本上只是一个指向MSDN的链接,没有太多帮助。 - Magier
2
即使是到MSDN的链接也根本没有解释为什么有人会选择使用SQLCMD脚本而不是直接使用TSQL。它只是解释了编辑的机制和语法。 - BradC
关于“即使是MSDN上的链接也完全没有解释为什么有人会选择使用SQLCMD脚本而不是直接使用TSQL”的问题,所链接文章的第二句话(至少在当前的“03/14/2017”版本,如果不是链接时的版本)已经给出了答案:“为什么”——“当您需要在同一脚本中处理Windows系统命令和Transact-SQL语句时,您可以使用SQLCMD脚本。” - Tom

19

"当您需要在同一个脚本中处理Windows系统命令和Transact-SQL语句时,可以使用SQLCMD脚本。"

"默认情况下,在查询编辑器中未启用SQLCMD模式。您可以通过单击工具栏中的SQLCMD模式图标或从查询菜单中选择SQLCMD模式来启用脚本模式。"

参考:MSDN


2
比解决方案更有意义和详细的内容。 - Jeb50

2

由于编辑器处于SQLCMD模式,因此此编辑器未激活Transact-SQL IntelliSense。

我正在使用Visual Studio将SQL Server项目发布到数据库以同步更改,但出现了上述错误。发布失败了。我关闭了VS中的所有打开文件,问题得到解决。

我希望通过现实生活的例子来解释为什么人们使用SQLCMD模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接