使用 sqlcmd 公用程式
公用 sqlcmd
程式是一個命令列公用程式,可用於臨機操作、互動式執行 Transact-SQL 語句和腳本,以及自動化 Transact-SQL 腳本工作。 若要以互動方式使用 sqlcmd
,或若要使用 建置要執行的 sqlcmd
腳本檔案,使用者必須瞭解 Transact-SQL。 一般而言,sqlcmd
公用程式的使用方式如下:
使用者以類似于在命令提示字元中運作的方式,以互動方式輸入 Transact-SQL 語句。 結果會顯示在命令提示字元視窗中。 若要開啟 [命令提示字元] 視窗,請按一下 [開始]、按一下 [所有程式]、指向 [附屬應用程式],然後按一下 [命令提示字元]。 在命令提示字元中,輸入
sqlcmd
,後面接著您要使用的一串選項。 如需 所支援sqlcmd
之選項的完整清單,請參閱 sqlcmd 公用程式。使用者藉由指定要執行的單一 Transact-SQL 語句,或將公用程式指向包含要執行的 Transact-SQL 語句的文字檔,來提交
sqlcmd
作業。 輸出通常會導向文字檔,不過,也可以在命令提示字元上顯示。SQL Server Management Studio 查詢編輯器中的 SQLCMD 模式。
SQL Server 管理物件 (SMO)
SQL Server Agent CmdExec 作業
一般使用的 sqlcmd 選項
以下是最常使用的選項:
伺服器選項 (-S) ,可識別連線到的
sqlcmd
Microsoft SQL Server實例。驗證選項 (-E、-U和-P) ,指定
sqlcmd
用來連線至 SQL Server 實例的認證。注意
-E 選項是預設值,不需要予以指定。
輸入選項 (-Q、-q和-i) ,以識別輸入的位置。
sqlcmd
輸出選項 (-o) ,指定要在其中放置其輸出的
sqlcmd
檔案。
連接到 sqlcmd 公用程式
下列是 sqlcmd
公用程式的一般用途:
使用 Windows 驗證連線到預設執行個體,以互動方式執行 Transact-SQL 陳述式:
sqlcmd -S <ComputerName>
注意
在上一個範例中,未指定 -E ,因為它是預設值,並使用
sqlcmd
Windows 驗證連線到預設實例。使用 Windows 驗證連線到具名執行個體,以互動方式執行 Transact-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 AdventureWorks2012.Person.Person"
使用 Windows 驗證連接到本機電腦上的預設執行個體、執行查詢、將輸出導向至檔案,然後在查詢完成後結束
sqlcmd
:sqlcmd -Q "SELECT * FROM AdventureWorks2012.Person.Person" -o MyOutput.txt
使用 SQL Server Authentication 連線到具名實例,以互動方式執行 Transact-SQL 語句,並
sqlcmd
提示輸入密碼:sqlcmd -U MyLogin -S <ComputerName>\<InstanceName>
注意
若要查看
sqlcmd
公用程式所支援的選項清單,請執行:sqlcmd -?
。
使用 sqlcmd 以互動方式執行 Transact-SQL 陳述式
您可以在命令提示字元視窗中以互動方式使用 sqlcmd
公用程式來執行 Transact-SQL 語句。 若要使用 sqlcmd
以互動方式執行 Transact-SQL 語句,請在不使用 -Q、 -q、 -Z或 -i 選項的情況下執行公用程式,以指定任何輸入檔案或查詢。 例如:
sqlcmd -S <ComputerName>\<InstanceName>
在沒有輸入檔案或查詢的情況下執行命令時, sqlcmd
會連線至指定的實例SQL Server,然後顯示新的一行,後面接著名為 1>
提示的閃爍底線 sqlcmd
。 1
表示這是 Transact-SQL 語句的第一行,提示 sqlcmd
是 Transact-SQL 語句在輸入時啟動的點。
在提示中 sqlcmd
,您可以同時輸入 Transact-SQL 語句和 sqlcmd
命令,例如 GO
和 EXIT
。 每個 Transact-SQL 陳述式會放在稱為陳述式快取的緩衝區中。 這些語句會在您輸入 GO
命令並按 ENTER 鍵之後,傳送至 SQL Server。 若要結束 sqlcmd
,請在新行的開頭輸入 EXIT
或 QUIT
。
若要清除陳述式快取,請輸入 :RESET
。 輸入 ^C
會導致 sqlcmd
結束。 在發出 ^C
命令後,也可以使用 GO
來停止執行陳述式快取。
在互動式會話中輸入的 Transact-SQL 語句,可以藉由輸入 :ED 命令和 sqlcmd
提示來編輯。 此時會開啟編輯器,而在編輯 Transact-SQL 陳述式並關閉編輯器之後,修訂的 Transact-SQL 陳述式便會出現在命令視窗中。 輸入 GO
以執行該處的 Transact-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:\> _
這表示資料夾 C:\
是目前的資料夾,如果您指定了檔案名稱,則 Windows 將會在該資料夾中尋找這個檔案。
輸入 sqlcmd
以連線到本機電腦上SQL Server的預設實例,而 [命令提示字元] 視窗的內容將會是:
C:\>sqlcmd
1> _
這表示您已經連線到 SQL Server 的執行個體,而且 sqlcmd
現在已準備好要接受 Transact-SQL 陳述式和 sqlcmd
命令。 在 1>
後面的閃爍底線是 sqlcmd
提示字元,該字元標示將顯示您輸入之陳述式與命令的位置。 現在,輸入 USE AdventureWorks2012
並按 ENTER,然後按 GO
ENTER。 [命令提示字元] 視窗的內容將如下所示:
sqlcmd
USE AdventureWorks2012;
GO
以下為結果集。
Changed database context to 'AdventureWorks2012'.
1> _
輸入 USE AdventureWorks2012
之後按下 ENTER,會指示 sqlcmd
開始新的一行。 輸入 GO,
signaledsqlcmd
之後按 ENTER 鍵,以將 USE AdventureWorks2012
陳述式傳送至 SQL Server 的執行個體。 sqlcmd
便接著傳回訊息指出 USE
陳述式已順利完成,並且顯示新的 1>
提示字元,表示可以再輸入新的陳述式或命令。
下列範例顯示當您輸入 SELECT
陳述式、再輸入 GO
執行 SELECT
,然後輸入 EXIT
結束 sqlcmd
時,[命令提示字元] 視窗中出現的內容:
sqlcmd
USE AdventureWorks2012;
GO
SELECT TOP (3) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
以下為結果集。
BusinessEntityID FirstName LastName
----------- -------------------------------- -----------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
(3 rows affected)
1> EXIT
C:\>
在 3> GO
這一行後面的那幾行,是 SELECT
陳述式的輸出。 產生輸出後, sqlcmd
會重設 sqlcmd
提示字元,並顯示 1>
。 在 EXIT
行輸入 1>
之後,[命令提示字元] 視窗會顯示和您初次開啟這個視窗時同樣的一行。 這表示 sqlcmd
已經結束其工作階段。 您現在可以輸入另一個 EXIT
命令,來關閉 [命令提示字元] 視窗。
使用 sqlcmd 執行 Transact-SQL 指令碼檔案
您可以使用 sqlcmd
來執行資料庫指令碼檔案。 腳本檔案是包含 Transact-SQL 語句、 sqlcmd
命令和腳本變數混合的文字檔。 如需如何編寫指令碼變數的詳細資訊,請參閱 以指令碼變數使用 sqlcmd。 sqlcmd
在指令碼檔案中使用陳述式、命令及指令碼變數的方式,與它使用互動方式輸入陳述式及命令的方式類似。 主要的差別在於 sqlcmd
會讀取整個輸入檔而不暫停,而不是等待使用者輸入陳述式、命令及指令碼變數。
建立資料庫指令碼檔案有許多不同的方式:
您可以透過互動方式在 SQL Server Management Studio 中建置一組 Transact-SQL 陳述式並進行偵錯,然後將 [查詢] 視窗的內容儲存為指令檔。
您可以使用文字編輯器 (例如記事本),來建立包含 Transact-SQL 陳述式的文字檔。
範例
A. 使用 sqlcmd 執行指令碼
啟動記事本,然後輸入下列 Transact-SQL 陳述式:
USE AdventureWorks2012;
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
當您在「記事本」中檢視 MyOutput.txt
的內容時,會看到下列項目:
Changed database context to 'AdventureWorks2012'.
BusinessEntityID FirstName LastName
---------------- ----------- -----------
1 Syed Abbas
2 Catherine Abel
3 Kim Abercrombie
(3 rows affected)
B. 透過專用管理連接使用 sqlcmd
在下列範例中,使用 sqlcmd
透過專用管理員連接 (DAC) 連接到發生封鎖問題的伺服器。
C:\>sqlcmd -S ServerName -A
1> SELECT blocked FROM sys.dm_exec_requests WHERE blocked <> 0;
2> GO
以下為結果集。
spid blocked
------ -------
62 64
(1 rows affected)
使用 sqlcmd
結束封鎖處理序。
1> KILL 64;
2> GO
C. 使用 sqlcmd 執行預存程序
下列範例顯示如何使用 sqlcmd
來執行預存程序。 建立下列預存程序。
USE AdventureWorks2012;
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
在 sqlcmd
提示字元中,輸入下列命令:
C:\sqlcmd
1> :Setvar FirstName Gustavo
1> :Setvar LastName Achong
1> EXEC dbo.ContactEmailAddress $(Gustavo),$(Achong)
2> GO
EmailAddress
-----------------------------
gustavo0@adventure-works.com
D. 使用 sqlcmd 進行資料庫維護
下列範例顯示如何使用 sqlcmd
進行資料庫維護工作。 以下列程式碼建立 C:\BackupTemplate.sql
。
USE master;
BACKUP DATABASE [$(db)] TO DISK='$(bakfile)';
在 sqlcmd
提示字元中,輸入下列命令:
C:\ >sqlcmd
1> :connect <server>
Sqlcmd: Successfully connected to server <server>.
1> :setvar db msdb
1> :setvar bakfile c:\msdb.bak
1> :r c:\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:\>sqlcmd -d AdventureWorks2012
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:\InputFile.txt -o C:\OutputFile.txt,
命令可以與 VBScript 一起在.bat檔案中執行。 在這種情況下,請不要使用互動式選項。 sqlcmd
必須安裝在執行 .bat 檔案的電腦上。
首先,建立下列四個檔案:
C:\badscript.sql
SELECT batch_1_this_is_an_error GO SELECT 'batch #2' GO
C:\goodscript.sql
SELECT 'batch #1' GO SELECT 'batch #2' GO
C:\returnvalue.sql
:exit(select 100) @echo off C:\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:\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:\windowsscript.bat
:
C:\>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_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 提供者設定包含 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 -T
使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:
SQLCMD -E -N -C
如果提供者指定 ForceProtocolEncryption = True
,則會啟用加密,即使 Encrypt=No
在連接字串中。
另請參閱
sqlcmd 公用程式
以指令碼變數使用 sqlcmd
使用查詢編輯器編輯 SQLCMD 指令碼
管理作業步驟
建立 CmdExec 作業步驟