使用 sqlcmd

适用于:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics分析平台系统(PDW)Microsoft Fabric中的SQL数据库

sqlcmd 是一个命令行实用工具,用于临时、交互式执行 Transact-SQL (T-SQL) 语句和脚本。 它还自动执行 T-SQL 脚本任务。 若要以交互方式使用 sqlcmd 或为 sqlcmd 生成脚本文件,应了解 T-SQL。 可以通过多种方式使用 sqlcmd。 例如:

  • 从命令行接口(CLI)输入 T-SQL 语句。 控制台会返回结果。

    Note

    在 Windows 中,可以使用 Windows 搜索框中打开命令提示符窗口 cmd ,然后选择 命令提示符。 在 macOS 和 Linux 中,可以使用内置终端模拟器。

    sqlcmd键入控制台,然后键入所需的选项列表,然后按 Enter。 有关 sqlcmd 支持的选项的完整列表,请参阅 sqlcmd 实用工具

  • 通过以下方式提交 sqlcmd 作业:指定要执行的单个 T-SQL 语句,或将实用工具指向要执行的 T-SQL 语句所在的文本文件。 输出将定向到文本文件,但也可以显示在控制台中。

  • SQL Server Management Studio 中的 SQLCMD 模式(SSMS)。

  • SQL Server 管理对象 (SMO)。

  • SQL Server 代理 CmdExec 作业。

常用的 sqlcmd 选项

  • 服务器选项 (-S),用于标识 sqlcmd 连接到的 SQL Server 实例

  • 身份验证选项(-E-U-P),用于指定 sqlcmd 连接到 SQL Server 实例所使用的凭据

    Note

    此选项 -E 为默认值,无需指定。

  • 输入选项(-Q-q-i),用于标识 sqlcmd 输入的位置

  • 输出选项 (-o) 指定 sqlcmd 在其中写入其输出的文件。

连接到 sqlcmd 实用工具

  • 使用 Windows 身份验证连接到默认实例,以交互方式运行 T-SQL 语句:

    sqlcmd -S <ComputerName>
    

    Note

    在上一示例中, -E 未指定,因为它是默认值。 sqlcmd 使用 Windows 身份验证连接到默认实例。

  • 使用 Windows 身份验证连接到命名实例,以交互方式运行 T-SQL 语句:

    sqlcmd -S <ComputerName>\<InstanceName>
    

    or

    sqlcmd -S .\<InstanceName>
    
  • 使用 Windows 身份验证连接到命名实例,并指定输入和输出文件:

    sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
    
  • 使用 Windows 身份验证连接到本地计算机上的默认实例,执行查询,并在查询完成后保持 sqlcmd 的运行状态

    sqlcmd -q "SELECT * FROM AdventureWorks2025.Person.Person"
    
  • 使用 Windows 身份验证连接到本地计算机上的默认实例,执行查询,将输出定向到某个文件,并在查询完成后退出 sqlcmd

    sqlcmd -Q "SELECT * FROM AdventureWorks2025.Person.Person" -o MyOutput.txt
    
  • 使用 SQL Server 身份验证连接到命名实例,以交互方式运行 T-SQL 语句,并由 sqlcmd 提示输入密码

    sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
    

    Tip

    若要查看 sqlcmd 实用工具支持的选项的列表,请运行: sqlcmd -?

使用 sqlcmd 以交互方式运行 Transact-SQL 语句

使用 sqlcmd 实用工具以交互方式在控制台中执行 T-SQL 语句。 若要使用 sqlcmd 以交互方式执行 T-SQL 语句,请在未使用 -Q-q-Z 选项指定任何输入文件或查询的情况下运行该实用工具-i。 例如:

sqlcmd -S <ComputerName>\<InstanceName>

在没有输入文件或查询的情况下运行命令时, sqlcmd 将连接到 SQL Server 的指定实例。 然后,它显示一个新行,后接一个 1> 和一个闪烁的下划线,该下划线称为 sqlcmd 提示符。 1 表示这是 T-SQL 语句的第一行,而 sqlcmd 提示符则是你键入 T-SQL 语句的起点

在 sqlcmd 提示符中,可以键入 T-SQL 语句和 sqlcmd 命令,例如 GOEXIT。 每个 T-SQL 语句进入名为语句缓存的缓冲区。 键入 GO 命令并按 Enter 键后,这些语句将发送到 SQL Server。 若要退出 sqlcmd,请在新行的开头键入 EXITQUIT

若要清除语句缓存,请键入 :RESET。 键入 Ctrl+C 会导致 sqlcmd 退出。 Ctrl+C 还可用于在命令后 GO 停止执行语句缓存。

:EDsqlcmd 提示符处输入命令以编辑 T-SQL 语句。 编辑器随即打开,编辑 T-SQL 语句并关闭编辑器后,修订后的 T-SQL 语句将显示在命令窗口中。 输入 GO 可以运行修改后的 T-SQL 语句。

带引号的字符串

可以使用括在引号中的字符,而无需进行任何额外的预处理,但可以通过输入两个连续引号将引号插入字符串中。 SQL Server 将这种字符序列视作一个引号。 (但在服务器上会进行转换。)当脚本变量出现在字符串中时不会展开。

例如:

sqlcmd
PRINT "Length: 5"" 7'";
GO

结果集如下。

Length: 5" 7'

跨多行的字符串

sqlcmd 支持跨多行的字符串。 例如,以下 SELECT 语句跨多行,但在键入 GO 并按 Enter 键后,它将作为单个字符串执行

SELECT <First line>
FROM <Second line>
WHERE <Third line>;
GO

交互式 sqlcmd 示例

此示例显示以交互方式运行 sqlcmd 时看到的内容。

在 Windows 中打开控制台窗口时,可能会看到类似于以下示例的输出:

C:\Temp\>

此行表示文件夹 C:\Temp\ 是当前文件夹。 如果指定文件名,作系统将查找该文件夹中的文件。

键入 sqlcmd 以连接到本地计算机上的 SQL Server 的默认实例。 控制台窗口的内容如下所示:

C:\Temp>sqlcmd
1>

此输出表示已连接到 SQL Server 实例。 sqlcmd 现已准备好接受 T-SQL 语句和 sqlcmd 命令。 1> 后面的闪烁下划线是 sqlcmd 提示符。 它标记键入的语句和命令的显示位置。 现在,键入 USE AdventureWorks2025 并按 Enter。 然后,键入 GO 并按 Enter。 控制台的内容如下所示:

sqlcmd
USE AdventureWorks2025;
GO

结果集如下。

Changed database context to 'AdventureWorks2025'.
1>

按 Enter 键时,它会指示 sqlcmd 启动新行。 当您键入后按 Enter 键时,sqlcmd 会将 GO 语句发送到 USE AdventureWorks2025 实例。 然后,sqlcmd 返回一条消息,指示USE语句已成功完成。 它将新 1> 提示显示为输入新语句或命令的信号。

以下示例显示了键入 SELECT 语句、使用 GO 执行 SELECT ,以及使用 EXIT 退出 sqlcmd 时控制台包含的内容:

USE AdventureWorks2025;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

结果集如下。

BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie

sqlcmd 生成输出后,它会重置 sqlcmd 提示符并显示1>。 在1>提示符处键入EXIT退出会话。 现在,可以通过键入另一个 EXIT 命令(后跟 Enter)关闭控制台窗口。

创建和查询 SQL Server 容器

可以使用 sqlcmd (Go) 在容器中创建新的 SQL Server 实例sqlcmd(Go)提供一个create语句来指定容器镜像和 SQL Server 备份。 可以快速创建用于开发、调试和分析的 SQL Server 实例。

Important

需要安装容器运行时,例如 DockerPodman

以下命令演示如何查看可用于新建 SQL Server 容器的所有选项:

sqlcmd create mssql --help

以下命令使用最新版本的 SQL Server 2025 (17.x)创建新的 SQL Server 实例,然后还原 Wide World Importers 示例数据库:

sqlcmd create mssql --accept-eula --tag 2025-latest --using https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak

创建 SQL Server 实例后,使用 sqlcmd (Go) 管理和查询它。

以下命令确认创建的实例的版本:

sqlcmd query "SELECT @@version"

以下命令使用创建的实例启动交互式会话:

sqlcmd query

以下命令列出了用于连接到所创建的实例的连接字符串:

sqlcmd config connection-strings

使用以下命令在不再需要容器时将其删除:

sqlcmd delete

使用 sqlcmd 运行 Transact-SQL 脚本文件

使用 sqlcmd 运行数据库脚本文件。 脚本文件是一些文本文件,其中混合了 T-SQL 语句、sqlcmd 命令和脚本变量。 有关如何编写变量脚本的详细信息,请参阅 将 sqlcmd 与脚本变量配合使用sqlcmd 使用脚本文件中的语句、命令和脚本变量的方式类似于它如何与以交互方式输入的语句和命令一起使用。 主要区别在于 sqlcmd 从输入文件连续读取内容,而不是等待用户输入语句、命令和脚本变量

可以通过不同的方式创建数据库脚本文件:

  • 在 SQL Server Management Studio 中以交互方式生成和调试一组 T-SQL 语句,然后将查询窗口的内容保存为脚本文件。

  • 使用文本编辑器(如记事本)创建包含 T-SQL 语句的文本文件。

Examples

A. 使用 sqlcmd 运行脚本

启动记事本并键入以下 T-SQL 语句:

USE AdventureWorks2025;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO

创建一个名为 MyFolder 的文件夹,然后将脚本另存为文件夹 MyScript.sql 中的文件 C:\MyFolder。 在控制台中输入以下命令以运行脚本,并将输出放入MyOutput.txt中的MyFolder中。

sqlcmd -i C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt

结果集如下。

Changed database context to 'AdventureWorks2025'.
BusinessEntityID  FirstName  LastName
----------------- ---------- ------------
1                 Syed       Abbas
2                 Catherine  Abel
3                 Kim        Abercrombie
(3 rows affected)

B. 通过专用管理连接使用 sqlcmd

以下示例使用 sqlcmd 通过专用管理员连接(DAC)连接到有阻塞问题的服务器。

C:\Temp\>sqlcmd -S ServerName -A
1> SELECT session_id, blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id <> 0;
2> GO

结果集如下。

session_id   blocking_session_id
-----------  --------------------`
62           64
(1 rows affected)

使用 sqlcmd 结束阻塞进程

1> KILL 64;
2> GO

C. 使用 sqlcmd 执行存储过程

以下示例演示如何使用 sqlcmd 执行存储过程。 创建以下存储过程。

USE AdventureWorks2025;
GO

IF OBJECT_ID('dbo.ContactEmailAddress', 'P') IS NOT NULL
    DROP PROCEDURE dbo.ContactEmailAddress;
GO

CREATE PROCEDURE dbo.ContactEmailAddress (
    @FirstName NVARCHAR(50),
    @LastName NVARCHAR(50)
)
AS
SET NOCOUNT ON;

SELECT EmailAddress
FROM Person.Person
WHERE FirstName = @FirstName
    AND LastName = @LastName;

SET NOCOUNT OFF;
GO

sqlcmd 提示符下,输入以下命令:

C:\Temp\sqlcmd
1> :Setvar FirstName Gustavo
1> :Setvar LastName Achong
1> EXEC dbo.ContactEmailAddress $(FirstName),$(LastName)
2> GO
EmailAddress
-----------------------------
gustavo0@adventure-works.com

D. 使用 sqlcmd 进行数据库维护

以下示例演示如何将 sqlcmd 用于数据库维护任务。 使用以下代码创建 C:\Temp\BackupTemplate.sql

USE master;
BACKUP DATABASE [$(db)] TO DISK = '$(bakfile)';

在 sqlcmd 提示符下,输入以下代码

C:\Temp\>sqlcmd
1> :connect <server>
Sqlcmd: Successfully connected to server <server>.
1> :setvar db msdb
1> :setvar bakfile C:\Temp\msdb.bak
1> :r C:\Temp\BackupTemplate.sql
2> GO
Changed database context to 'master'.
Processed 688 pages for database 'msdb', file 'MSDBData' on file 2.
Processed 5 pages for database 'msdb', file 'MSDBLog' on file 2.
BACKUP DATABASE successfully processed 693 pages in 0.725 seconds (7.830 MB/sec)

E. 使用 sqlcmd 在多个实例上运行代码

某文件中的以下代码表示一个连接到两个实例的脚本。 请在连接到第二个实例之前注意GO

:CONNECT <server>\,<instance1>
EXEC dbo.SomeProcedure
GO
:CONNECT <server>\,<instance2>
EXEC dbo.SomeProcedure
GO

F. 返回 XML 输出

以下示例演示 XML 输出如何以未格式化的连续流的形式返回。

C:\Temp\>sqlcmd -d AdventureWorks2025
1> :XML ON
1> SELECT TOP 3 FirstName + ' ' + LastName + ', '
2> FROM Person.Person
3> GO
Syed Abbas, Catherine Abel, Kim Abercrombie,

G. 在 Windows 脚本文件中使用 sqlcmd

可以在某个文件中并通过 VBScript 运行 sqlcmd 命令,例如sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt。 在此方案中不要使用交互式选项。 必须在运行该文件的计算机上安装 .bat

首先,在 C:\Temp 中创建以下四个文件:

  • C:\Temp\badscript.sql

    SELECT batch_1_this_is_an_error
    GO
    SELECT 'batch #2'
    GO
    
  • C:\Temp\goodscript.sql

    SELECT 'batch #1';
    GO
    SELECT 'batch #2';
    GO
    
  • C:\Temp\returnvalue.sql

    :exit(select 100)
    
  • C:\Temp\windowsscript.bat

    @echo off
    
    echo Running badscript.sql
    sqlcmd -i badscript.sql -b -o out.log
    if not errorlevel 1 goto next1
    echo == An error occurred
    
    :next1
    
    echo Running goodscript.sql
    sqlcmd -i goodscript.sql -b -o out.log
    if not errorlevel 1 goto next2
    echo == An error occurred
    
    :next2
    echo Running returnvalue.sql
    sqlcmd -i returnvalue.sql -o out.log
    echo SQLCMD returned %errorlevel% to the command shell
    
    :exit
    

然后,在控制台中运行 C:\Temp\windowsscript.bat

C:\Temp\>windowsscript.bat
Running badscript.sql
== An error occurred
Running goodscript.sql
Running returnvalue.sql

SQLCMD returned 100 to the command shell

H. 使用 sqlcmd 在 Azure SQL 数据库上设置加密

可以在与 SQL 数据库数据的连接上运行 sqlcmd ,以指定加密和证书信任。 有两个 sqlcmd 选项可供选择

  • -N 切换是客户端请求加密连接的过程。 此选项等同于 ADO.NET 选项 ENCRYPT = true

  • -C 开关将客户端配置为隐式信任服务器证书,而不对其进行验证。 此选项等同于 ADO.NET 选项 TRUSTSERVERCERTIFICATE = true

SQL 数据库服务并不支持 SQL Server 实例上所有可用的 SET 选项。 将相应的 SET 选项设置为 ONOFF 时,下面的选项将引发错误:

  • SET ANSI_DEFAULTS
  • SET ANSI_NULLS
  • SET REMOTE_PROC_TRANSACTIONS
  • SET ANSI_NULL_DEFAULT

以下 SET 选项已弃用。 它们不会引发异常,但不能使用:

  • SET CONCAT_NULL_YIELDS_NULL
  • SET ANSI_PADDING
  • SET QUERY_GOVERNOR_COST_LIMIT

Syntax

以下示例介绍了 SQL Server Native Client 提供程序设置涉及的用例:

  • ForceProtocolEncryption = False
  • Trust Server Certificate = No

使用 Windows 凭据进行连接并对通信加密:

sqlcmd -E -N

使用 Windows 凭据进行连接并信任服务器证书:

sqlcmd -E -C

使用 Windows 凭据进行连接、加密通信和信任服务器证书:

sqlcmd -E -N -C

以下示例介绍了 SQL Server Native Client 提供程序设置涉及的用例:

  • ForceProtocolEncryption = True
  • TrustServerCertificate = Yes

使用 Windows 凭据进行连接、加密通信和信任服务器证书:

sqlcmd -E

使用 Windows 凭据进行连接、加密通信和信任服务器证书:

sqlcmd -E -N

使用 Windows 凭据进行连接、加密通信和信任服务器证书:

sqlcmd -E -C

使用 Windows 凭据进行连接、加密通信和信任服务器证书:

sqlcmd -E -N -C

如果提供程序指定了 ForceProtocolEncryption = True,则启用加密,即使连接字符串中包含 Encrypt=No