使用查询编辑器编辑 SQLCMD 脚本

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

使用 SQL Server Management Studio 中的数据库引擎查询编辑器,可以将查询作为 SQLCMD 脚本进行编写和编辑。 当在同一脚本中处理 Windows 系统命令和 Transact-SQL 语句时,请使用 SQLCMD 脚本。

SQLCMD 模式

若要使用 数据库引擎 查询编辑器编写或编辑 SQLCMD 脚本,您必须启用 SQLCMD 脚本撰写模式。 默认情况下,查询编辑器中不允许使用 SQLCMD 模式。 可以通过在工具栏中选择“SQLCMD 模式”图标或从“查询”菜单中选择“SQLCMD 模式”来启用脚本撰写模式。

注意

启用 SQLCMD 模式将关闭数据库引擎查询编辑器中的 IntelliSense 和 Transact-SQL 调试器。

查询编辑器中的 SQLCMD 脚本可以使用所有 Transact-SQL 脚本能够使用的功能。 这些功能包括:

  • 颜色编码
  • 执行脚本
  • 源代码管理
  • 分析脚本
  • Showplan

在查询编辑器中启用 SQLCMD 脚本撰写

若要为活动的数据库引擎查询编辑器窗口打开 SQLCMD 脚本撰写,请使用以下步骤。

将数据库引擎查询编辑器窗口切换到 SQLCMD 模式

  1. 在“对象资源管理器”中,右键单击服务器,再选择“新建查询”以打开新的数据库引擎查询编辑器窗口。

  2. 在“查询”菜单中,选择“SQLCMD 模式”。

    查询编辑器将在其上下文中执行 SQLCMD 语句。

  3. “SQL 编辑器” 工具栏的 “可用数据库” 列表中,选择 AdventureWorks2022

  4. 在“查询编辑器”窗口中,键入以下 Transact-SQL 语句和 !!DIR SQLCMD 语句:

    SELECT DISTINCT Type FROM Sales.SpecialOffer;
    GO
    !!DIR
    GO
    SELECT ProductCategoryID, Name FROM Production.ProductCategory;
    GO
    
  5. 按 F5 执行混合了 Transact-SQL 和 MS-DOS 语句部分。

    请注意第一个和第三个语句产生的两个 SQL 结果窗格。

  6. 在“结果”窗格中,选择“消息”选项卡可以查看所有三个语句产生的消息:

    • (6 行受影响)
    • <目录信息>
    • (4 row(s) affected)

重要

从命令行执行 sqlcmd 实用工具时,该工具允许与操作系统完全交互。 在 “SQLCMD 模式” 下使用查询编辑器时,必须注意不要执行交互语句。 查询编辑器无法响应操作系统提示。

有关如何运行 SQLCMD 的详细信息,请参阅 sqlcmd 实用工具或学习 SQLCMD 教程。

默认启用 SQLCMD 脚本撰写

若要默认启用 SQLCMD 脚本撰写,请在“工具”菜单中选择“选项”,展开“查询执行”和“SQL Server”,选择“常规”页面,然后选中“默认情况下,在 SQLCMD 模式下打开新查询”框。

编写和编辑 SQLCMD 脚本

启用脚本撰写模式后,可以编写 SQLCMD 命令和 Transact-SQL 语句。 下列规则适用:

  • SQLCMD 命令必须是一行中的第一个语句。

  • 每行只允许使用一个 SQLCMD 命令。

  • SQLCMD 命令前可以添加注释或空格。

  • 注释字符内的 SQLCMD 命令不会执行。

  • 单行注释字符是两个连字符 (--),必须位于一行的开头。

  • 操作系统命令前面必须具有两个感叹号 (!!)。 两个感叹号命令使其后的语句通过 cmd.exe 命令处理器来执行。 !! 后面的文本作为一个参数传递到 cmd.exe,因此最终的命令行将如此执行: "%SystemRoot%\system32\cmd.exe /c <text after !!>"

  • 为了清楚地区分 SQLCMD 命令和 Transact-SQL,所有的 SQLCMD 命令都需要在前面添加冒号 (:)。

  • GO 命令可以直接使用,无需在其前面加 !!:

  • 数据库引擎查询编辑器支持环境变量和定义为 SQLCMD 脚本的一部分的变量,但不支持内置的 SQLCMD 或 osql 变量。 SQL Server Management Studio 在执行 SQLCMD 处理时对变量区分大小写。 例如,PRINT '$(COMPUTERNAME)' 会生成正确的结果,而 PRINT '$(ComputerName)' 则返回错误。

注意

在常规模式和 SQLCMD 模式下,SQL Server Management Studio 在执行中使用 Microsoft .NET FrameworkSqlClient。 从命令行运行时,SQLCMD 将使用 OLE DB 访问接口。 由于可以应用不同的默认选项,因此在 SQL Server Management Studio SQLCMD 模式下以及在 SQLCMD 实用工具中执行相同的查询时,可能会获得不同的行为。

支持的 SQLCMD 语法

数据库引擎 查询编辑器支持以下 SQLCMD 脚本关键字:

  • [!!:]GO[count]
  • !! <command>
  • :exit(statement)
  • :Quit
  • :r <filename>
  • :setvar <var> <value>
  • :connect server[\instance] [-l login_timeout] [-U user [-P password]]
  • :on error [ignore|exit]
  • :error <filename>|stderr|stdout
  • :out <filename>|stderr|stdout

注意

对于 :error:outstderrstdout,将向消息选项卡发送输出。

查询编辑器不支持上面未列出的 SQLCMD 命令。 执行包含不支持的 SQLCMD 关键字的脚本时,查询编辑器会为每个不支持的关键字向目标发送一条“忽略命令 <忽略的命令>”消息。 脚本将成功执行,但同时忽略不支持的命令。

注意

因为不是从命令行启动 SQLCMD,所以在 SQLCMD 模式下运行查询编辑器时会有一些限制。 不能传入命令行参数(如变量),而且,由于查询编辑器无法响应操作系统提示,因此必须注意不要执行交互语句。

SQLCMD 脚本中的颜色编码

启用 SQLCMD 脚本撰写后,脚本将进行颜色编码。 Transact-SQL 关键字的颜色编码将保持不变。 SQLCMD 命令用阴影背景来表示。

示例

下面的示例使用 SQLCMD 语句创建名为 testoutput.txt 的输出文件,并将两个 Transact-SQL SELECT 语句与一个操作系统命令一起执行(以打印当前目录)。 结果文件包含 DIR 语句的消息输出和 Transact-SQL 语句的结果输出。

:out C:\testoutput.txt
SELECT @@VERSION As 'Server Version';
!!DIR
!!:GO
SELECT @@SERVERNAME AS 'Server Name';
GO

后续步骤