使用 sqlcmd

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 資料庫

SQLCMD 是一款用於臨時、互動式執行 Transact-SQL(T-SQL)語句與腳本的命令列工具。 它也能自動化 T-SQL 腳本任務。 要互動式使用 sqlcmd 或建立 sqlcmd 的腳本檔案,你應該了解 T-SQL。 您可以透過各種方式來使用 sqlcmd。 例如:

  • 輸入命令列介面(CLI)中的 T-SQL 語句。 主控台會傳回結果。

    Note

    在 Windows 中,你可以透過 cmd 搜尋框開啟命令提示字元視窗,並選擇 命令提示字元。 在 macOS 和 Linux 上,你可以使用內建的終端機模擬器。

    輸入 sqlcmd 主控台,接著列出你想要的選項,然後 按 Enter。 關於 sqlcmd 支援的完整選項清單,請參見 sqlcmd 工具。

  • 提交 sqlcmd 工作,方法為指定要執行的單一 T-SQL 陳述式,或將公用程式指向文字檔,其中包含要執行的 T-SQL 陳述式。 輸出會導向文字檔,但也可以在主控台中顯示。

  • SQL Server 管理工作室(SSMS)中的 SQLCMD 模式。

  • SQL Server 管理物件 (SMO)。

  • SQL 伺服器代理 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 沒有指定,因為它是預設值。 SQL CMD 透過 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 命令 (例如 GO 和 EXIT)。 每個 T-SQL 語句會放入一個稱為語句快取的緩衝區。 這些陳述式會在您鍵入 GO 命令並按 Enter 鍵之後,傳送至 SQL Server。 若要結束 sqlcmd,在新的一行的開頭鍵入 EXIT 或 QUIT。

若要清除陳述式快取,請鍵入 :RESET。 輸入 Ctrl+C 會導致 sqlcmd 退出。 Ctrl+C 也可以用來在指令GO結束後停止敘述快取的執行。

在 :ED 提示字元輸入指令來編輯 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 開始新行。 在輸入之後按下GO鍵,通知sqlcmd將USE AdventureWorks2025語句傳送到 SQL Server 實例。 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>。 輸入EXIT於1>提示符以退出會話。 你現在可以透過輸入另一個 EXIT 指令,接著按 Enter 鍵來關閉主控台視窗。

建立及查詢 SQL Server 容器

您可以使用 sqlcmd (Go) 在容器中建立 SQL Server 的新執行個體。 sqlcmd (Go)會暴露一個 create 用來指定容器映像和 SQL Server 備份的陳述式。 你可以快速建立 SQL Server 實例,用於開發、除錯和分析。

Important

你需要安裝容器執行環境,例如 Docker 或 Podman。

下列命令示範如何查看用於建立新 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。 SQL CMD 處理腳本檔案中的語句、指令和腳本變數,方式類似於互動式輸入的語句和指令。 主要的差別在於 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。 在這種情況下不要使用互動選項。 SQLCMD 必須安裝在執行該 .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 Database 的加密

你可以在連接 SQL 資料庫資料時執行 sqlcmd ,以指定加密和憑證信任。 有兩個 sqlcmd 選項可以使用:

  • -N交換器是客戶端對加密連線的請求。 這個選項相當於 ADO.NET 選項 ENCRYPT = true。

  • -C 開關將客戶端設定為自動信任伺服器憑證,而不驗證它。 這個選項相當於 ADO.NET 選項 TRUSTSERVERCERTIFICATE = true。

SQL Database 服務不支援 SQL Server 執行個體上的所有可用 SET 選項。 當對應的 SET 選項設定為 ON 或 OFF時,下列選項會擲回錯誤:

  • 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 在連接字串中。