適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 資料庫
sqlcmd 是一種命令列公用程式,以互動方式隨選執行 Transact-SQL (T-SQL) 陳述式與指令碼,以及自動化 T-SQL 指令碼任務。 若要以互動方式使用 sqlcmd,或為 sqlcmd 建置指令檔,您應該了解 T-SQL。 您可以透過各種方式來使用 sqlcmd。 例如:
從命令提示字元輸入 T-SQL 陳述式。 主控台會傳回結果。 若要開啟命令提示字元視窗,請在 Windows 搜尋方塊中輸入
cmd,然後選取 [命令提示字元] 以開啟。 在命令提示字元中,鍵入sqlcmd,後面接著您要使用的一串選項。 如需 sqlcmd 所支援選項的完整清單,請參閱 sqlcmd 公用程式。提交 sqlcmd 工作,方法為指定要執行的單一 T-SQL 陳述式,或將公用程式指向文字檔,其中包含要執行的 T-SQL 陳述式。 輸出會導向文字檔,但也可以在命令提示字元上顯示。
SQL Server Management Studio (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不會指定 ,因為它是預設值, 而 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 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>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 結束。 在發出 命令後,也可以使用 GO 來停止執行陳述式快取。
在互動式工作階段中輸入的 T-SQL 陳述式可以藉由輸入 :ED 命令和 sqlcmd 提示進行編輯。 此時會開啟編輯器,而在編輯 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 鍵,以指示 sqlcmd 將 USE AdventureWorks2022 陳述式傳送至 SQL Server 的執行個體。
sqlcmd 便接著傳回訊息指出 USE 陳述式已順利完成,並且顯示新的 1> 提示字元,表示可以再輸入新的陳述式或命令。
下列範例顯示當您鍵入 SELECT 陳述式、再鍵入 GO 以執行 SELECT,然後鍵入 EXIT 結束 sqlcmd 時,[命令提示字元] 視窗中出現的內容:
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>。 在 EXIT 提示符中鍵入 1> 以結束工作階段。 您現在可以輸入另一個 EXIT 命令,來關閉 [命令提示字元] 視窗。
建立及查詢 SQL Server 容器
您可以使用 sqlcmd (Go) 在容器中建立 SQL Server 的新執行個體。
sqlcmd (Go) 會公開 create 陳述式,可讓您指定容器映像和 SQL Server 備份,以快速建立 SQL Server 執行個體來用於開發、偵錯和分析目的。
下列命令示範如何查看用於建立新 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 命令及指令碼變數。 如需如何編寫變數腳本的詳細資訊,請參閱 搭配腳本變數使用 sqlcmd。 sqlcmd 在指令碼檔案中使用陳述式、命令及指令碼變數的方式,與它使用互動方式輸入陳述式及命令的方式類似。 主要的差別在於 sqlcmd 會讀取整個輸入檔而不暫停,而不是等待使用者輸入陳述式、命令及指令碼變數。
建立資料庫指令碼檔案有許多不同的方式:
您可以透過互動方式在 SQL Server Management Studio 中建置一組 T-SQL 陳述式並進行偵錯,然後將 [查詢] 視窗的內容儲存為指令檔。
您可以使用文字編輯器 (例如記事本),來建立包含 T-SQL 陳述式的文字檔。
Examples
A. 使用 sqlcmd 執行指令碼
啟動記事本,然後鍵入下列 T-SQL 陳述式:
USE AdventureWorks2022;
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 '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' GOC:\Temp\goodscript.sql
SELECT 'batch #1'; GO SELECT 'batch #2'; GOC:\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 選項設定為 ON 或 OFF時,下列選項會擲回錯誤:
SET ANSI_DEFAULTSSET ANSI_NULLSSET REMOTE_PROC_TRANSACTIONSSET ANSI_NULL_DEFAULT
以下 SET 選項不會擲回例外狀況,但不能使用。 它們已被淘汰:
SET CONCAT_NULL_YIELDS_NULLSET ANSI_PADDINGSET QUERY_GOVERNOR_COST_LIMIT
Syntax
下列範例指的是 SQL Server Native Client 提供者設定中包含的情況。
ForceProtocolEncryption = FalseTrust Server Certificate = No
使用 Windows 認證來連接,並加密通訊:
sqlcmd -E -N
使用 Windows 認證及信任伺服器憑證進行連接:
sqlcmd -E -C
使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:
sqlcmd -E -N -C
下列範例指的是 SQL Server Native Client 提供者設定中包含的情況。
ForceProtocolEncryption = TrueTrustServerCertificate = Yes
使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:
sqlcmd -E
使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:
sqlcmd -E -N
使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:
sqlcmd -E -C
使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:
sqlcmd -E -N -C
如果提供者指定 ForceProtocolEncryption = True,則會啟用加密,即使 Encrypt=No 在連接字串中。