【问题标题】:In SQL Server Management Studio what is SQLCMD mode?在 SQL Server Management Studio 中,什么是 SQLCMD 模式?
【发布时间】:2012-02-01 14:06:36
【问题描述】:

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

【问题讨论】:

标签: sql-server ssms


【解决方案1】:

我做了一些更多的研究,所以这是我对此的理解,以扩展迄今为止所写的内容:

什么是 SQLCMD

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

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

Invoke-Sqlcmd cmdlet 是随 SQL Server 2008 一起引入的,目的是用基于 Powershell 的标准化方法替换此工具,同时保留大部分原始语法和功能。

什么是 SSMS 中的 SQLCMD 模式

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

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

示例用例

假设一家公司对名称中包含环境的数据库有一个命名约定,例如:MyDb_ProdMyDb_Test强>MyDb_Dev。此约定可能用于minimize chance of mistakes

开发者在编写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]

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

【讨论】:

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

听起来确实如此。

这是一种允许您编写 SQLCMD 脚本的模式。

来自 MSDN - Editing SQLCMD Scripts with Query Editor:

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

在 SQL Server Management Studio 中,通过查询菜单(查询 -> SQLCMD 模式)进行设置。

【讨论】:

  • 显然不是我,但是很多资源并没有真正说明使用 SQLCMD 和仅在 Management Studio 中运行一些 T-SQL 语句之间的区别。 Visual Studio 上周为我生成的转换脚本会检查 SQLCMD 是否已启用,如果未启用则拒绝运行,并且在 Management Studio 的“查询”菜单中似乎有一个启用/禁用它的选项。所以是有区别的,但是很多资源基本上只是说 SQLCMD 是一个非常棒的设备,它可以让你运行 T-SQL 语句和批处理,然后就不用管它了。
  • 这个答案通过使用 SQLCMD 来解释 SQLCMD,基本上只不过是指向 MSDN 的链接。所以它没有帮助。
  • 即使是到 MSDN 的链接也没有解释根本为什么有人可能会选择使用 SQLCMD 脚本而不是直接的 TSQL。它只是解释了编辑的机制和语法。
  • 回复。 “即使是到 MSDN 的链接也根本无法解释为什么有人可能会选择使用 SQLCMD 脚本而不是直接使用 TSQL。”:链接的文章的第二句(至少是当前的“2017 年 3 月 14 日”版本)如果不是链接时的版本)说“为什么”-“当您必须在同一脚本中处理 Windows 系统命令和 Transact-SQL 语句时,您使用 SQLCMD 脚本。”。
【解决方案3】:

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

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

参考:MSDN

【讨论】:

  • 比解决方案更有意义更详细。
【解决方案4】:

消息 Transact-SQL IntelliSense 对该编辑器无效,因为该编辑器处于 SQLCMD 模式。

我正在将 SQL Server 项目从 Visual Studio 发布到数据库以同步更改并收到上述错误。发布失败。 我关闭了 VS 中所有打开的文件,它解决了这个问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多