sqlcmd - 使用 公用程式

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

sqlcmd 公用程式是命令列公用程式,用於特定、互動式執行 Transact-SQL (T-SQL) 語句和腳本,以及自動化 T-SQL 腳本工作。 若要以互動方式使用 sqlcmd,或建置要使用 sqlcmd 執行的 腳本檔案,使用者必須瞭解 T-SQL。 一般而言, sqlcmd 公用程式的使用方式如下:

  • 使用者以類似在命令提示字元中運作的方式輸入 T-SQL 語句。 結果會顯示在命令提示字元視窗中。 若要開啟 [命令提示字元] 視窗,請在 [Windows] 搜尋方塊中輸入 cmd ,然後選取 [ 命令提示字元 ] 以開啟。 在命令提示字元中,輸入 sqlcmd ,後面接著您想要的選項清單。 如需 sqlcmd 所支援 之選項的完整清單,請參閱 sqlcmd 公用程式

  • 使用者藉由指定要執行的單一 T-SQL 語句,或將公用程式指向包含要執行的 T-SQL 語句的文字檔,來提交 sqlcmd 作業。 輸出會導向文字檔,但也可以在命令提示字元上顯示。

  • SQL Server Management Studio (SSMS) 查詢編輯器中的 SQLCMD 模式

  • SQL Server 管理物件 (SMO)。

  • SQL Server Agent CmdExec 作業

一般使用的 sqlcmd 選項

  • 伺服器選項 ( -S ) 會識別 sqlcmd 連接的 SQL Server 實例。

  • 驗證選項 ( -E-U-P ) 會指定 sqlcmd 用來連線到 SQL Server 實例的認證。

    注意

    此選項 -E 是預設值,不需要指定。

  • 輸入選項 ( -Q-q-i ) 會識別 sqlcmd 輸入 的位置。

  • 輸出選項 ( -o ) 會指定 sqlcmd 用來放置其輸出的檔案

連接到 sqlcmd 公用程式

  • 使用 Windows 驗證以互動方式執行 T-SQL 語句,連線到預設實例:

    sqlcmd -S <ComputerName>
    

    注意

    在上一個範例中, -E 未指定 ,因為它是預設值 ,而且 sqlcmd 會使用 Windows 驗證連接到預設實例。

  • 使用 Windows 驗證連線到具名實例,以互動方式執行 T-SQL 語句:

    sqlcmd -S <ComputerName>\<InstanceName>
    

    sqlcmd -S .\<InstanceName>
    
  • 使用 Windows 驗證並指定輸入和輸出檔案,連線到具名實例:

    sqlcmd -S <ComputerName>\<InstanceName> -i <MyScript.sql> -o <MyOutput.rpt>
    
  • 使用 Windows 驗證、執行查詢,並在 查詢完成執行之後繼續執行 sqlcmd ,連線到本機電腦上的預設實例:

    sqlcmd -q "SELECT * FROM AdventureWorks2022.Person.Person"
    
  • 使用 Windows 驗證、執行查詢、將輸出導向檔案,並在 查詢完成執行之後結束 sqlcmd ,連線到本機電腦上的預設實例:

    sqlcmd -Q "SELECT * FROM AdventureWorks2022.Person.Person" -o MyOutput.txt
    
  • 使用 SQL Server 驗證連線到具名實例,以互動方式執行 T-SQL 語句,並 提示輸入密碼的 sqlcmd

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

    提示

    若要查看 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 停止執行語句快取。

輸入命令和 sqlcmd 提示字元,即可編輯 :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 時所看到的範例。

當您開啟命令提示字元視窗時,只會出現類似下面這一行:

C:\Temp\>

這表示資料夾 C:\Temp\ 是目前的資料夾,而且如果您指定檔案名,Windows 會尋找該資料夾中的檔案。

輸入 sqlcmd 以連線到本機電腦上的 SQL Server 預設實例,而 [命令提示字元] 視窗的內容如下所示:

C:\Temp>sqlcmd
1>

這表示您已連線到 SQL Server 的實例,而 sqlcmd 現在已準備好接受 T-SQL 語句和 sqlcmd 命令。 之後 1> 閃爍的底線是 sqlcmd 提示字元,會標記您輸入語句和命令顯示的位置。 現在,輸入 USE AdventureWorks2022 並按 Enter ,然後按 GO Enter 。 [命令提示字元] 視窗的內容如下所示:

sqlcmd
USE AdventureWorks2022;
GO

以下為結果集。

Changed database context to 'AdventureWorks2022'.
1>

當您按下 Enter 鍵時,它會發出 sqlcmd 來啟動新行的訊號 。 輸入 GO 之後按 Enter ,會 發出 sqlcmd ,以將語句傳送 USE AdventureWorks2022 至 SQL Server 實例。 sqlcmd 接著會傳回訊息,指出 USE 語句已順利完成,並顯示新的 1> 提示做為輸入新語句或命令的訊號。

下列範例顯示如果您輸入 SELECT 語句、 GO 執行 的 ,以及 EXIT 要結束 sqlcmd SELECT ,命令提示字元視窗會包含的內容:

USE AdventureWorks2022;
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 命令,來關閉 [命令提示字元] 視窗。

建立和查詢 SQL Server 容器

您可以使用 sqlcmd (Go) 在容器中建立 SQL Server 的新實例。 sqlcmd (Go) 會 create 公開語句,可讓您指定容器映射和 SQL Server 備份,以快速建立 SQL Server 實例以供開發、偵錯和分析之用。

重要

您需要安裝容器執行時間,例如 Docker Podman

下列命令示範如何查看建立新 SQL Server 容器的所有可用選項:

sqlcmd create mssql --help

下列命令會使用最新版的 SQL Server 2022 (16.x),建立新的 SQL Server 實例,然後還原 Wide World Importers 範例資料庫:

sqlcmd create mssql --accept-eula --tag 2022-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

下列命令會開啟 Azure Data Studio,並自動連線到建立程式期間還原的資料庫:

sqlcmd open ads

下列命令會列出用來連線至已建立之實例的連接字串:

sqlcmd config connection-strings

當不再需要容器時,會使用下列命令來移除容器:

sqlcmd delete

使用 sqlcmd 執行 Transact-SQL 指令檔

您可以使用 sqlcmd 來執行資料庫指令碼檔案。 腳本檔案是包含 T-SQL 語句、 sqlcmd 命令和腳本變數混合的文字檔。 如需如何編寫指令碼變數的詳細資訊,請參閱 以指令碼變數使用 sqlcmdsqlcmd 在指令碼檔案中使用陳述式、命令及指令碼變數的方式,與它使用互動方式輸入陳述式及命令的方式類似。 主要的差別在於 sqlcmd 會讀取整個輸入檔而不暫停,而不是等待使用者輸入陳述式、命令及指令碼變數。

建立資料庫指令碼檔案有許多不同的方式:

  • 您可以在 SQL Server Management Studio 中以互動方式建置和偵錯一組 T-SQL 語句,然後將 [查詢] 視窗的內容儲存為腳本檔案。

  • 您可以使用文字編輯器,例如記事本,建立包含 T-SQL 語句的文字檔。

範例

A. 使用 sqlcmd 執行指令碼

啟動 [記事本],然後輸入下列 T-SQL 語句:

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

建立名為 MyFolder 的資料夾,然後在資料夾 MyScript.sql 中將指令碼儲存為檔案 C:\MyFolder。 在命令提示字元中輸入下列命令,以執行腳本,並將輸出放入 中 MyOutput.txtMyFolder

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

以下為結果集。

Changed database context to 'AdventureWorks2022'.
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 AdventureWorks2022;
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

E. 傳回 XML 輸出

下列範例顯示 XML 輸出如何在連續資料流中傳回未格式化的資料。

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

F. 在 Windows 指令檔中使用 sqlcmd

sqlcmd命令 (例如 sqlcmd -i C:\Temp\InputFile.txt -o C:\Temp\OutputFile.txt, ) 可以在 .bat 檔案中與 VBScript 一起執行。 在這種情況下,請不要使用互動式選項。 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

G. 使用 sqlcmd 設定 Azure SQL Database 的加密

sqlcmd 可以在 連線至 上的 SQL Database 資料上執行,以指定加密和憑證信任。 有兩 個 sqlcmd 選項可供使用:

  • -N用戶端會使用 參數來要求加密的連線。 這個選項相當於 ADO.net 選項 ENCRYPT = true

  • -C用戶端會使用 參數來將它設定為隱含信任伺服器憑證,而不會驗證它。 這個選項相當於 ADO.net 選項 TRUSTSERVERCERTIFICATE = true

SQL Database 服務不支援 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

語法

下列範例會參考 SQL Server Native Client Provider 設定包括下列案例:

  • ForceProtocolEncryption = False
  • Trust Server Certificate = No

使用 Windows 認證來連接,並加密通訊:

sqlcmd -E -N

使用 Windows 認證及信任伺服器憑證進行連接:

sqlcmd -E -C

使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:

sqlcmd -E -N -C

下列範例會參考 SQL Server Native Client Provider 設定包括下列案例:

  • ForceProtocolEncryption = True
  • TrustServerCertificate = Yes

使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:

sqlcmd -E

使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:

sqlcmd -E -N

使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:

sqlcmd -E -C

使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:

sqlcmd -E -N -C

如果提供者指定 ForceProtocolEncryption = True ,則即使 Encrypt=No 連接字串中也啟用加密。

下一步