公用 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 伺服器代理 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 驗證連線到具名實例,以互動方式執行 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 實例,然後顯示一個新行,其中包含一個名為 sqlcmd 提示的閃爍底線 1> 。
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> _
按下 ENTER 鍵後,輸入 USE AdventureWorks2012 通知 sqlcmd 開始新行。 按下 ENTER 鍵後,輸入GO,以示意sqlcmd將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>。 在行1>輸入 EXIT 之後,[命令提示字元] 視窗會顯示與第一次開啟時相同的行。 這表示 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' GOC:\goodscript.sql
SELECT 'batch #1' GO SELECT 'batch #2' GOC:\rreturnvalue.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 :exitC:\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 (設置 ANSI 默認值)
SET ANSI_NULLS(設定 ANSI_NULLS)
SET REMOTE_PROC_TRANSACTIONS
SET ANSI_NULL_DEFAULT
下列 SET 選項不會擲回例外狀況,但無法使用。 它們已被取代:
SET CONCAT_NULL_YIELDS_NULL
SET ANSI_PADDING(設置 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 -T
使用 Windows 認證進行連接、加密通訊並信任伺服器憑證:
SQLCMD -E -N -C
如果提供者指定 ForceProtocolEncryption = True,則啟用加密,即使在連接字串中指定 Encrypt=No。
另請參閱
sqlcmd 公用程式
搭配腳本變數使用 sqlcmd
使用查詢編輯器編輯 SQLCMD 指令碼
管理作業步驟
建立 CmdExec 作業步驟