sqlcmd 公用程式
公用sqlcmd
程式可讓您在命令提示字元中,在 SQLCMD 模式的 查詢編輯器、Windows 腳本檔案或 SQL Server Agent 作業的作業系統 (Cmd.exe) 作業步驟中輸入 Transact-SQL 語句、系統程式和腳本檔案。 此公用程式會使用 ODBC 來執行 Transact-SQL 批次。
重要
SQL Server Management Studio 會使用 Microsoft.NET FrameworkSqlClient,在 查詢編輯器 中以一般和 SQLCMD 模式執行。 從命令行執行 時 sqlcmd
, sqlcmd
請使用 ODBC 驅動程式。 因為可能會套用不同的預設選項,因此當您在 SQL Server Management Studio 中以 SQLCMD 模式和 sqlcmd
公用程式執行相同的查詢時,可能會看到不同的行為。
sqlcmd
目前,命令行選項與值之間不需要空格。 不過,在未來版本中,命令行選項與值之間可能需要空格。
語法
sqlcmd
-a
packet_size
-A (dedicated administrator connection)
-b (terminate batch job if there is an error)
-cbatch_terminator-C (trust the server certificate)
-ddb_name-e (echo input)
-E (use trusted connection)
-fcodepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]
-hrows_per_header-Hworkstation_name-iinput_file-I (enable quoted identifiers)
-k[1 | 2] (remove or replace control characters)
-Kapplication_intent-llogin_timeout-L[c] (list servers, optional clean output)
-merror_level-Mmultisubnet_failover-N (encrypt connection)
-ooutput_file-p[1] (print statistics, optional colon format)
-Ppassword-q "cmdline query"-Q "cmdline query" (and exit)
-r[0 | 1] (msgs to stderr)
-R (use client regional settings)
-scol_separator-S [protocol:]server[\instance_name][,port]
-tquery_timeout-u (unicode output file)
-Ulogin_id-vvar = "value"-Verror_severity_level-wcolumn_width-W (remove trailing spaces)
-x (disable variable substitution)
-X[1] (disable commands, startup script, environment variables and optional exit)
-yvariable_length_type_display_width-Yfixed_length_type_display_width-znew_password -Znew_password (and exit)
-? (usage)
命令列選項
登入相關選項
-一個
使用專用系統管理員連線登入 SQL Server(DAC)。 這種連接可用以進行伺服器的疑難排解。 這隻適用於支援 DAC 的伺服器電腦。 如果 DAC 無法使用, sqlcmd
則會產生錯誤訊息,然後結束。 如需有關 DAC 的詳細資訊,請參閱 資料庫管理員的診斷連線。
-C
這個參數由用戶端所設定,以隱含方式信任伺服器憑證而且不進行驗證。 這個選項相當於 ADO.NET 選項 TRUSTSERVERCERTIFICATE = true
。
-d db_name
當您USE
啟動 sqlcmd
時,會發出db_name語句。 此選項會 sqlcmd
設定文本變數 SQLCMDDBNAME。 這會指定初始資料庫。 預設值為您登入的預設資料庫屬性。 如果資料庫不存在,就會產生錯誤訊息並 sqlcmd
結束。
-l login_timeout
指定當您嘗試連線到伺服器時,登入 ODBC 驅動程式逾時之前的 sqlcmd
秒數。 此選項會 sqlcmd
設定文本變數 SQLCMDLOGINTIMEOUT。 登入的預設逾時為 sqlcmd
8秒。 此登入逾時必須是介於 0 和 65534 之間的數字。 如果所提供的值不是數值或不屬於該範圍, sqlcmd
則會產生錯誤訊息。 0 值指定逾時值無限。
-E
使用信任的連線,而不是使用使用者名稱和密碼登入 SQL Server。 根據預設,若未指定 -E, sqlcmd
就會使用信任的連接選項。
-E 選項會忽略可能出現的使用者名稱與密碼環境變數設定,例如 SQLCMDPASSWORD。 如果同時使用 -E 選項和 -U 或 -P 選項,就會產生錯誤訊息。
-H workstation_name
這是工作站名稱。 此選項會 sqlcmd
設定文本變數 SQLCMDWORKSTATION。 工作站名稱會列在 sys.processes 目錄檢視的主機名數據行中,而且可以使用預存程式sp_who傳回。 如果未指定這個選項,預設值為目前的電腦名稱。 此名稱可用來識別不同的 sqlcmd
會話。
-K application_intent
宣告連接到伺服器時的應用程式工作負載類型。 目前唯一支援的值是 ReadOnly。 如果未 指定 -K,sqlcmd 公用程式將不支持連線至 AlwaysOn 可用性群組中的次要複本。 如需詳細資訊,請參閱 使用中次要:可讀取的次要複本。
-M
multisubnet_failover
在連線至 SQL Server 可用性群組的可用性群組接聽程式或 SQL Server 容錯移轉叢集執行個體時,一律指定 -M
。 -M
可提供對 (目前) 作用中伺服器更快速的偵測和連線。 如果未 -M
指定 , -M
則會關閉。 如需 AlwaysOn 可用性群組的詳細資訊,請參閱可用性群組接聽程式、用戶端連線和應用程式故障轉移(SQL Server)、可用性群組的建立和設定(SQL Server)、故障轉移叢集和 AlwaysOn 可用性群組(SQL Server)和使用中次要:可讀取的次要複本。
-N
用戶端會用這個參數要求加密的連接。
-P password
這是一個使用者指定的密碼。 密碼會區分大小寫。 如果使用 -U 選項且 未使用 -P 選項,且尚未設定 SQLCMDPASSWORD 環境變數, sqlcmd
則會提示使用者輸入密碼。 如果在命令提示字元結尾使用 -P 選項,而不使用密碼sqlcmd
會使用默認密碼 (NULL)。
重要
請勿使用空白密碼。 請使用增強式密碼。 如需詳細資訊,請參閱 Strong Passwords。
密碼提示的顯示方式,會以將密碼提示輸出到主控台的方式顯示,如: Password:
使用者輸入為隱藏狀態。 這表示畫面上不會顯示任何內容,而且游標也不會移動。
SQLCMDPASSWORD 環境變數可讓您設定目前工作階段的預設密碼。 因此,您不需要將密碼寫在批次檔中。
下列範例會先在命令提示字元設定 SQLCMDPASSWORD 變數,然後存取 sqlcmd
公用程式。 在命令提示字元中,輸入:
SET SQLCMDPASSWORD= p@a$$w0rd
重要
任何可以看到電腦監視器的人都能看到密碼。
請在下列命令提示字元之下,輸入:
sqlcmd
如果使用者名稱和密碼的組合不正確,會產生錯誤訊息。
注意
OSQLPASSWORD 環境變數已保留為回溯相容性。 SQLCMDPASSWORD 環境變數優先於 OSQLPASSWORD 環境變數;這表示 sqlcmd
和 osql 可以彼此使用,而不會受到干擾,而且舊的腳本會繼續運作。
如果同時使用 -P 選項和 -E 選項,就會產生錯誤訊息。
如果 -P 選項後面有多個引數,便會產生錯誤訊息,而且程式將會結束。
-S [protocol:]server[\instance_name][,port]
指定要連線的 SQL Server 執行個體。 它會設定 sqlcmd
文本變數 SQLCMDSERVER。
指定 server_name,即可連線至該伺服器電腦上之 SQL Server 的預設執行個體。 指定 server_name [ \instance_name ],即可連線到該伺服器電腦的 SQL Server 具名執行個體。 如果未指定伺服器電腦, sqlcmd
請連線到本機電腦上的 SQL Server 預設實例。 當您從網路上的遠端電腦執行 sqlcmd
時,需要此選項。
protocol 可以是 tcp
(TCP/IP)、lpc
(共用記憶體) 或 np
(具名管道)。
如果您在啟動 sqlcmd
時未指定server_name [ \instance_name ] ,SQL Server 會檢查並使用 SQLCMDSERVER 環境變數。
注意
保留 OSQLSERVER 環境變數的目的是為了與舊版相容。 SQLCMDSERVER 環境變數優先於 OSQLSERVER 環境變數;這表示 sqlcmd
和 osql 可以彼此使用,而不會受到干擾,而且舊的腳本會繼續運作。
-U login_id
這是使用者登入識別碼。
注意
可利用 OSQLUSER 環境變數達到回溯相容性。 SQLCMDUSER 環境變數優先於 OSQLUSER 環境變數。 這表示 sqlcmd
和 osql 可以在彼此旁邊使用,而不會受到干擾。 這也表示現有的 osql 指令碼仍然有效。
如果未指定 -U 選項或 -P 選項,sqlcmd
請使用 Microsoft Windows 驗證模式嘗試連線。 驗證是以執行 sqlcmd
的使用者 Windows 帳戶為基礎。
如果 -U 選項與 -E 選項搭配使用(本主題稍後所述),則會產生錯誤訊息。 如果 -U 選項後面有多個引數,就會產生錯誤訊息並結束程式。
-z new_password
變更密碼:
sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd
-Z new_password
變更密碼並結束:
sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd
輸入/輸出選項
-f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]
指定輸入和輸出字碼頁。 字碼頁碼是一個數值,指定已安裝的 Windows 字碼頁。
字碼頁轉換規則:
如果未指定任何代碼頁,
sqlcmd
除非輸入檔是 Unicode 檔案,否則會針對輸入和輸出檔案使用目前的代碼頁,在此情況下不需要轉換。sqlcmd
會自動辨識 big-endian 和 little-endian Unicode 輸入檔。 如果已指定 -u 選項,則輸出一律為位元組由小到大的 Unicode。如果未指定輸出檔,則輸出字碼頁會是主控台字碼頁。 這可讓輸出在控制台上正確顯示。
假設多個輸入檔都是相同的字碼頁。 Unicode 與非 Unicode 的輸入檔可以混合使用。
在命令提示字元中輸入 chcp
,以確認Cmd.exe的代碼頁。
-i input_file[,input_file2...]
識別包含 SQL 陳述式或預存程序的批次之檔案。 您可以指定多個檔案,它們會依照順序加以讀取和處理。 檔案名稱之間不能有空格。 sqlcmd
會先檢查,以查看所有指定的檔案是否存在。 如果一或多個檔案不存在, sqlcmd
將會結束。 -i 和 -Q/-q 為互斥選項。
路徑範例:
-i C:\<filename>
-i \\<Server>\<Share$>\<filename>
-i “C:\Some Folder\<file name>”
包含空格的檔案路徑必須用引號括住。
此選項可能不止一次使用: -iinput_file -Iinput_file。
-o output_file
識別從 接收輸出 sqlcmd
的檔案。
如果指定 -u , output_file 會以 Unicode 格式儲存。 如果檔名無效,就會產生錯誤訊息並 sqlcmd
結束。 sqlcmd
不支援將多個 sqlcmd
進程並行寫入相同的檔案。 檔案輸出會損毀或不正確。 如需檔格式的詳細資訊,請參閱 -f 參數。 如果不存在,則會建立這個檔案。 將會覆寫先前 sqlcmd
會話中同名的檔案。 此處所指定的檔案並不是 stdout 檔案。 如果指定 stdout 檔案,將不會使用此檔案。
路徑範例:
-o C:\< filename>
-o \\<Server>\<Share$>\<filename>
**-o “**C:\Some Folder\<file name>”
包含空格的檔案路徑必須用引號括住。
-r[0 | 1]
將錯誤訊息輸出重新導向至畫面 (stderr)。 如果您沒有指定參數,或指定 0,只會重新導向嚴重性層級 11 (含) 以上的錯誤訊息。 如果您指定 1,便會重新導向包括 PRINT 在內的所有錯誤訊息輸出。 如果您使用 -o,不會有任何作用。 根據預設,訊息會傳送到 stdout。
-R
導致 sqlcmd
根據客戶端的地區設定,將從 SQL Server 擷取的數值、貨幣、日期和時間數據行當地語系化。 根據預設,這些資料行會使用伺服器的地區設定來顯示。
-u
指定無論 input_file 的格式為何, output_file均以 Unicode 格式儲存。
查詢執行選項
-e
將輸入指令碼寫入標準的輸出裝置 (stdout) 中。
-I
將 SET QUOTED_IDENTIFIER 連接選項設為 ON。 依預設,此選項設定為 OFF。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER (Transact-SQL)。
-q“ cmdline query ”
啟動時 sqlcmd
執行查詢,但在查詢完成執行時不會結束 sqlcmd
。 可以執行多項以分號分隔的查詢。 請依照下列範例所示,利用引號來括住查詢。
在命令提示字元中,輸入:
sqlcmd -d AdventureWorks2012 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2012 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要
請勿在查詢中使用 GO 結束字元。
如果 -b
與此選項一起指定,則會 sqlcmd
在錯誤時結束。 -b
本主題稍後會說明。
-Q“ Cmdline query ”
在啟動時 sqlcmd
執行查詢,然後立即結束 sqlcmd
。 可以執行多項以分號分隔的查詢。
請依照下列範例所示,利用引號來括住查詢。
在命令提示字元中,輸入:
sqlcmd -d AdventureWorks2012 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2012 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要
請勿在查詢中使用 GO 結束字元。
如果 -b
與此選項一起指定,則會 sqlcmd
在錯誤時結束。 -b
本主題稍後會說明。
-t query_timeout
指定命令 (或 SQL 語句) 逾時之前的秒數。此選項會 sqlcmd
設定文本變數 SQLCMDSTATTIMEOUT。 如果未指定time_out值,命令就不會逾時。query**time_out必須是介於 1 到 65534 之間的數位。 如果所提供的值不是數值或不屬於該範圍, sqlcmd
則會產生錯誤訊息。
注意
實際逾時值可能與指定的 time_out 值之間有幾秒的差異。
-vvar = value[ var = value...]
sqlcmd
建立可在腳本中使用的sqlcmd
腳本變數。 如果值包含空格,請用引號括住該值。 您可以指定多個 var=“values
值。 如果指定的任何值發生錯誤, sqlcmd
則會產生錯誤訊息,然後結束。
sqlcmd -v MyVar1=something MyVar2="some thing"
sqlcmd -v MyVar1=something -v MyVar2="some thing"
-x
導致 sqlcmd
忽略腳本變數。 當腳本包含許多 INSERT 語句時,這可能包含與一般變數具有相同格式的字串,例如 $(variable_name)。
格式化選項
-h headers
指定資料行標頭之間所要列印的資料列數。 預設值是每一組查詢結果各列印一次標頭。 此選項會 sqlcmd
設定文本變數 SQLCMDHEADERS。 使用 -1 指定不能列印標頭。 無效的任何值都會產生 sqlcmd
錯誤訊息,然後結束。
-k [1 | 2]
從輸出中移除所有控制字元,如定位字元和新行字元。 這會在傳回數據時保留數據行格式。 如果指定 1,會用單一空格來取代控制字元。 如果指定 2,會用單一空格取代連續控制字元。 -k 與 -k1相同。
-s col_separator
指定資料行分隔字元。 預設值是空格。 此選項會 sqlcmd
設定文本變數 SQLCMDCOLSEP。 若要使用對操作系統有特殊意義的字元,例如 ampersand (&),或分號 (;),請將字元括在引號中()。 資料行分隔字元可以是任何 8 位元的字元。
-w column_width
指定輸出的螢幕寬度。 此選項會 sqlcmd
設定文本變數 SQLCMDCOLWIDTH。 資料行寬度必須是大於 8 且小於 65536 的數字。 如果指定的數據行寬度不落在該範圍中, sqlcmd
則會產生 和 錯誤訊息。 預設寬度是 80 個字元。 當輸出行超出指定的資料行寬度時,它會折行。
-W
這個選項會從資料行中移除尾端的空格。 在準備要匯出至另一個應用程式的資料時,請使用 -s 選項與這個選項。 這個選項不能搭配 -y 或 -Y 選項一起使用。
-y variable_length_type_display_width
sqlcmd
設定腳本變數 SQLCMDMAXVARTYPEWIDTH。 預設值是 256。 這會限制大型可變長度資料類型的傳回字元數:
varchar(max)
nvarchar(max)
varbinary(max)
xml
UDT (user-defined data types)
text
ntext
image
注意
UDT 可以是固定長度,這會隨著實作情況而不同。 如果固定長度 UDT 的長度小於 display_width,傳回的 UDT 值不會受到影響。 不過,如果長度超出 display_width,便會截斷輸出。
重要
使用 -y 0 選項時,要非常小心,因為它可能會讓伺服器和網路出現嚴重的效能問題,這會隨著傳回的資料大小而不同。
-Y fixed_length_type_display_width
sqlcmd
設定腳本變數 SQLCMDMAXFIXEDTYPEWIDTH。 預設值是 0 (無限制)。 限制針對下列資料類型傳回的字元數:
char(
n)
,其中 1<=n<=8000nchar(n
n)
,其中 1<=n<=4000varchar(n
n)
,其中 1<=n<=8000nvarchar(n
n)
,其中 1<=n<=4000varbinary(n
n)
,其中 1<=n<=4000variant
錯誤報告選項
-b
指定 sqlcmd
在發生錯誤時結束並傳回 DOS ERRORLEVEL 值。 當 SQL Server 錯誤訊息的嚴重性層級大於 10 時,傳回 DOS ERRORLEVEL 變數的值是 1;否則,傳回的值是 0。 -V
如果除了 已設定 -b
選項之外,sqlcmd
如果嚴重性層級低於使用 -V
所設定的值,則不會報告錯誤。 命令提示字元批次檔案可以測試 ERRORLEVEL 的值,而且能夠適當地處理錯誤。 sqlcmd
不會報告嚴重性層級 10 的錯誤(參考訊息)。
sqlcmd
如果腳本包含不正確的批註、語法錯誤或遺漏腳本變數,則傳回的 ERRORLEVEL 為 1。
-m error_level
控制哪些錯誤訊息會傳送至 stdout。 系統會傳送嚴重性層級大於或等於這個層級的訊息。 當這個值設定為 -1時,系統就會傳送包括資訊訊息的所有訊息。 -m 與 -1之間不允許有空格。 例如, -m-1 有效,而 -m-1 則無效。
此選項也會設定 sqlcmd
腳本變數 SQLCMDERRORLEVEL。 這個變數具有預設值 0。
-V
error_severity_level
控制用來設定 ERRORLEVEL 變數的嚴重性層級。 嚴重性層級大於或等於這個值的錯誤訊息會設定 ERRORLEVEL。 小於 0 的值會回報成 0。 批次和 CMD 檔案可用來測試 ERRORLEVEL 變數的值。
其他選項
-a packet_size
要求不同大小的封包。 此選項會 sqlcmd
設定文本變數 SQLCMDPACKETSIZE。 packet_size 必須是介於 512 與 32767 之間的值。 預設 = 4096。 較大的封包大小可以讓 GO 命令之間具有許多 SQL 陳述式的指令碼執行得以提高效能。 您可以要求較大的封包。 不過,如果要求遭到拒絕, sqlcmd
則會使用伺服器預設的封包大小。
-c batch_terminator
指定批次結束字元。 根據預設,在一行中單獨鍵入「GO」這個字,便會終止命令,並將命令傳給 SQL Server。 當您重設批次結束字元時,請勿使用對作業系統有特殊意義的 Transact-SQL 保留關鍵字或字元,即使它們前面附加了反斜線也一樣。
-L[c]
列出設定在本機的伺服器電腦,以及在網路中進行廣播的伺服器電腦名稱。 這個參數不能結合其他參數來使用。 可以列出的最大伺服器電腦數目為 3000。 如果伺服器清單因為緩衝區的大小而遭到截斷,將會顯示一則警告訊息。
注意
由於網路上廣播的性質, sqlcmd
因此可能不會收到來自所有伺服器的及時回應。 因此,這個選項每次的引動過程,所傳回的伺服器清單可能各不相同。
如果指定了選擇性參數 c ,則輸出會出現,但沒有伺服器:標頭行,而且每一個伺服器行都會列出,但沒有前置空格。 這稱為全新輸出。 清除輸出可以增進指令碼語言的處理效能。
-p[1]
列印每個結果集的效能統計資料。 以下是效能統計數據格式的範例:
Network packet size (bytes): n
x xact[s]:
Clock Time (ms.): total t1 avg t2 (t3 xacts per sec.)
其中:
x
= SQL Server 所處理的交易數目。
t1
= 所有交易的總時間。
t2
= 單一交易的平均時間。
t3
= 每秒的平均交易數。
所有時間都以毫秒表示。
如果指定了選擇性參數 1 ,統計資料的輸出格式是用冒號分隔的格式,很容易匯入試算表中,指令碼也很容易處理它。
如果選擇性參數是 1 以外的任何值,就會產生錯誤並sqlcmd
結束。
-X
[1]
停用從批處理檔執行時 sqlcmd
可能會危害系統安全性的命令。 已停用的命令仍可辨識; sqlcmd
發出警告訊息並繼續。 如果指定了選擇性參數 1 , sqlcmd
則會產生錯誤訊息,然後結束。 使用 -X
選項時,會停用下列命令:
ED
!!命令
如果指定選項 -X
,它會防止將環境變數傳遞至 sqlcmd
。 也無法執行利用 SQLCMDINI 指令碼變數所指定的啟動指令碼。 如需腳本變數的詳細資訊 sqlcmd
,請參閱 搭配腳本變數使用 sqlcmd。
-?
顯示選項的 sqlcmd
語法摘要。
備註
您不需要按照語法區段中顯示的順序使用選項。
傳回多個結果時, sqlcmd
列印批次中每個結果集之間的空白行。 此外,當「<x 個數據列受影響的」> 訊息不適用於執行的語句時,就不會顯示。
若要以互動方式使用 sqlcmd
,請在命令提示字元中輸入 sqlcmd
本主題稍早所述的任一或多個選項。 如需詳細資訊,請參閱 使用 sqlcmd 公用程式
注意
執行 后,-L、 -Q、 -Z 或 -i 選項會結束 sqlcmd
。
命令環境中命令行的總長度 sqlcmd
(Cmd.exe),包括所有自變數和展開變數,是由作業系統針對 Cmd.exe 所決定。
變數優先順序 (由低至高)
系統層級環境變數
使用者層級環境變數
執行 之前
sqlcmd
,在命令提示字元設定命令殼層 (SET X=Y) 。sqlcmd-v X=Y
:Setvar X Y
注意
若要檢視環境變數,請在 [控制台] 中開啟 [系統] ,然後按一下 [進階] 索引標籤。
sqlcmd 指令碼變數
變數 | 相關參數 | R/W | 預設 |
---|---|---|---|
SQLCMDUSER | -U | R | "" |
SQLCMDPASSWORD | -P | -- | "" |
SQLCMDSERVER | -S | R | "DefaultLocalInstance" |
SQLCMDWORKSTATION | -H | R | "ComputerName" |
SQLCMDDBNAME | -d | R | "" |
SQLCMDLOGINTIMEOUT | -l | R/W | "8" (秒) |
SQLCMDSTATTIMEOUT | -t | R/W | "0" = 永遠等候 |
SQLCMDHEADERS | -H | R/W | "0" |
SQLCMDCOLSEP | -S | R/W | " " |
SQLCMDCOLWIDTH | -w | R/W | "0" |
SQLCMDPACKETSIZE | -a | R | "4096" |
SQLCMDERRORLEVEL | -M | R/W | 0 |
SQLCMDMAXVARTYPEWIDTH | -y | R/W | "256" |
SQLCMDMAXFIXEDTYPEWIDTH | -y | R/W | "0" = 無限制 |
SQLCMDEDITOR | R/W | "edit.com" | |
SQLCMDINI | R | "" |
當 :Connect 時 ,會設定 SQLCMDUSER、SQLCMDPASSWORD 和 SQLCMDSERVER
會使用 。
R 表示在程式初始化期間只能設定該值一次。
R/W 表示可以使用 setvar 命令修改該值,且後續的命令會受到新值的影響。
sqlcmd 命令
除了 內的 sqlcmd
Transact-SQL 語句之外,也可以使用下列命令:
GO [count] | :List |
[ : ] RESET | :Error |
[ : ] ED | :Out |
[:] !! | :Perftrace |
[ : ] QUIT | :Connect |
[ : ] EXIT | :On Error |
:r | :Help |
:ServerList | :XML [ON | OFF] |
:Setvar | :Listvar |
當您使用 sqlcmd
命令時,請注意下列事項:
除了 GO 以外的所有
sqlcmd
命令前面都必須加上冒號 (:)。重要
為了維持與現有 osql 腳本的回溯相容性,將會辨識某些命令,而不需要冒號。 這是以 [:] 表示。
sqlcmd
只有在命令出現在行開頭時,才會辨識這些命令。所有
sqlcmd
命令都不區分大小寫。每個命令都必須在不同行中。 命令後面不能有 Transact-SQL 陳述式或另一個命令。
命令會立即執行, 不會像 Transact-SQL 陳述式一樣放在執行緩衝區中。
編輯命令
[ : ] ED
啟動文字編輯器。 您可以使用這個編輯器編輯目前的 Transact-SQL 批次,或上次執行的批次。 若要編輯上次執行的批次,在上一個批次執行完成之後,必須立即輸入 ED 命令。
文字編輯器由 SQLCMDEDITOR 環境變數來定義。 預設編輯器是 'Edit'。 若要變更編輯器,請設定 SQLCMDEDITOR 環境變數。 例如,若要將編輯器設為 Microsoft Notepad,請在命令提示字元之下,鍵入:
SET SQLCMDEDITOR=notepad
[ : ] RESET
清除陳述式快取。
:List
列印陳述式快取內容。
變數
:Setvar<var> [ “value
” ]
sqlcmd
定義腳本變數。 指令碼變數的格式如下: $(VARNAME)
。
變數名稱不區分大小寫。
指令碼變數可以透過下列幾種方式設定:
隱含地使用命令列選項。 例如, -l 選項會設定 SQLCMDLOGINTIMEOUT
sqlcmd
變數。明確地利用 :Setvar 命令。
在執行 之前
sqlcmd
定義環境變數。
注意
選項 -X
可防止將環境變數傳遞至 sqlcmd
。
如果使用 :Setvar 所定義的變數和環境變數同名,則以使用 :Setvar 所定義的變數優先。
變數名稱不能包含空格字元。
變數名稱的格式不能與變數運算式 (例如 $(var)) 相同。
如果指令碼變數的字串值包含空格,請用引號括住這個值。 如果未指定指令碼變數值,就會卸除指令碼變數。
:Listvar
顯示目前所設定之指令碼變數的清單。
注意
只會顯示 由 sqlcmd
所設定的腳本變數,以及使用 :Setvar 命令設定的變數。
輸出命令
:Error
<filename|>STDERR|STDOUT
將所有錯誤輸出重新導向至 filename所指定的檔案、 stderr 或 stdout。 在指令碼中, Error 命令可以重複出現。 根據預設,錯誤輸出會傳送到 stderr。
file name
建立和開啟用來接收輸出的檔案。 如果檔案已經存在,它會截斷成零位元組。 如果因為權限或其他原因無法使用,就不會切換輸出,輸出會送往最後指定的目的地或預設目的地。
STDERR
將錯誤輸出切換到 stderr 資料流。 如果它已重新導向,資料流所重新導向的目標會接收這個錯誤輸出。
STDOUT
將錯誤輸出切換到 stdout 資料流。 如果它已重新導向,資料流所重新導向的目標會接收這個錯誤輸出。
:Out < filename| > STDERR| STDOUT
建立並將所有查詢結果重新導向至 filename所指定的檔案、 stderr 或 stdout。 根據預設,輸出會傳送到 stdout。 如果檔案已經存在,它會截斷成零位元組。 在指令碼中, Out 命令可以重複出現。
:P erftrace < filename>| STDERR| STDOUT
建立並將所有效能追蹤資訊重新導向至 filename所指定的檔案、 stderr 或 stdout。 根據預設,效能追蹤輸出會傳送到 stdout。 如果檔案已經存在,它會截斷成零位元組。 在指令碼中, Perftrace 命令可以重複出現。
執行控制命令
:On Error[ exit
| ignore
]
設定執行指令碼或批次發生錯誤時所要執行的動作。
exit
使用 選項時,sqlcmd
會以適當的錯誤值結束。
ignore
使用 選項時,sqlcmd
會忽略錯誤並繼續執行批次或腳本。 根據預設,將會列印錯誤訊息。
[ : ] QUIT
導致 sqlcmd
結束。
[:] EXIT[ (statement
) ]
可讓您使用 SELECT 語句的結果做為 的 sqlcmd
傳回值。 如果為數值,最後一個結果資料列的第一個資料行會轉換成 4 位元組的整數 (long)。 MS-DOS 會將低位元組傳給父處理序或作業系統錯誤層級。 Windows 200x 會傳遞完整的 4 位元組整數。 語法為:
:EXIT(query)
例如:
:EXIT(SELECT @@ROWCOUNT)
您也可以將 EXIT 參數併入批次檔中。 例如,在命令提示字元之下,輸入:
sqlcmd -Q "EXIT(SELECT COUNT(*) FROM '%1')"
公用 sqlcmd
程式會將括弧 () 之間的所有項目傳送至伺服器。 如果系統預存程序選取某一組,傳回某個值,此時只會傳回選取的項目。 括號中沒有任何內容的 EXIT**()** 陳述式,會執行批次中在它前面的任何內容,然後結束作業,不傳回任何值。
指定了不正確的查詢時, sqlcmd
將會結束而不傳回值。
以下是 EXIT 格式清單:
- :EXIT
不執行批次,然後立即結束,不傳回任何值。
- :EXIT( )
執行批次之後,便結束作業,不傳回任何值。
- :EXIT(query)
執行包含查詢的批次,傳回查詢結果之後再結束。
如果在腳本內 sqlcmd
使用RAISERROR,且引發狀態為127, sqlcmd
將會結束並將訊息標識碼傳回用戶端。 例如:
RAISERROR(50001, 10, 127)
此錯誤會導致 sqlcmd
腳本結束,並將訊息標識碼 50001 傳回給用戶端。
傳回值 -1 到 -99 是由 SQL Server 保留; sqlcmd
定義下列其他傳回值:
傳回值 | 描述 |
---|---|
-100 | 在選取傳回值之前發生錯誤。 |
-101 | 在選取傳回值時,找不到任何資料列。 |
-102 | 在選取傳回值時,發生轉換錯誤。 |
GO [count]
GO 會發出批次結束及執行任何快取的 Transact-SQL 陳述式的信號。 指定 count 的值時,會將快取的語句以單一批次的形式執行計數時間。
其他命令
:r < 檔案名 >
將 **<filename
>** 所指定檔案的其他 Transact-SQL 語句和sqlcmd
命令剖析至語句快取。
如果檔案包含的 Transact-SQL 陳述式後面沒有緊接著 GO,您必須在 :r 之後的一行輸入 GO。
注意
<檔案名稱 >是相對於執行所在的sqlcmd
啟動目錄讀取。
在發現批次結束字元之後,便會讀取和執行這個檔案。 您可以發出多個 :r 命令。 檔案可能包含任何 sqlcmd
命令。 其中包括批次結束字元 GO。
注意
在互動式模式中顯示的行數將會針對遇到的每個 :r 命令增加一個。 :r 命令會出現在 list 命令的輸出中。
:Serverlist
列出設定在本機的伺服器,以及在網路中進行廣播的伺服器名稱。
:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]]
連線至 SQL Server 的執行個體。 此外也會關閉目前的連接。
逾時選項:
0 | 永久等候 |
n>0 | 等候 n 秒 |
SQLCMDSERVER 指令碼變數會反映目前作用中的連接。
如果沒有指定 timeout ,預設值就是 SQLCMDLOGINTIMEOUT 變數的值。
如果只指定 user_name (作為選項或作為環境變數),則會提示使用者輸入密碼。 如果已設定 SQLCMDUSER 或 SQLCMDPASSWORD 環境變數,則這不是 true。 如果未提供任何選項和環境變數,則會使用 Windows 驗證模式來登入。 例如,若要使用整合式安全性連線到 SQL Server 的 實例 、 instance1
、 myserver
,您可以使用下列專案:
:connect myserver\instance1
若要利用指令碼變數來連接 myserver
的預設執行個體,您將使用下列命令:
:setvar myusername test
:setvar myservername myserver
:connect $(myservername) $(myusername)
[ : ] !!<command>
執行作業系統命令。 若要執行作業系統命令,請在行首輸入兩個驚歎號 ( !! ),後面再接著作業系統命令。 例如:
:!! Dir
注意
命令會在執行所在的電腦上 sqlcmd
執行。
:XML [ON | OFF]
如需詳細資訊,請參閱本主題稍後的
:Help
列出 sqlcmd
命令以及每個命令的簡短描述。
sqlcmd 檔案名稱
sqlcmd
輸入檔案可以使用 -i 選項或 :r 命令來指定。 輸出檔則可以使用 -o 選項或 :Error、 :Out 和 :Perftrace 命令予以指定。 以下列出使用這些檔案的幾項指導方針:
:Error、:Out 和 :P erftrace 應該使用不同的 <
filename
>。 如果使用相同 <filename
> ,來自命令的輸入可能會混合在一起。如果本機計算機上呼叫位於遠端伺服器的
sqlcmd
輸入檔,且檔案包含磁碟驅動器檔案路徑,例如 :out c:\OutputFile.txt。 輸出檔案會在本機計算機上建立,而不是在遠端伺服器上建立。有效的檔案路徑包括:C:\、\Server\Share$>\ 和 “C:\Some Folder\<
file name
>”。<<><filename
><filename
> 如果路徑中有空格,請使用引號。每個新的
sqlcmd
會話都會覆寫具有相同名稱的現有檔案。
參考用訊息
sqlcmd
會列印伺服器所傳送的任何參考訊息。 在下列範例中,執行 Transact-SQL 陳述式之後,會列印一則參考用訊息。
在命令提示字元上鍵入下列字行:
sqlcmd
At the sqlcmd prompt type:
USE AdventureWorks2012;
GO
當您按 ENTER 時,會列印下列參考訊息:「已將資料庫內容變更為 'AdventureWorks2012'。」
Transact-SQL 查詢的輸出格式
sqlcmd
首先列印包含選取清單中指定之數據行名稱的數據行標頭。 資料行名稱是以 SQLCMDCOLSEP 字元分隔。 根據預設,這是一個空格。 如果資料行名稱長度小於資料行寬度,便會在輸出中填補空格直到下一個資料行。
這一行後面會接著一條由虛線字元組成的分隔線。 下列輸出顯示一個範例。
啟動 sqlcmd
。 在 sqlcmd
命令提示字元中,輸入下列命令:
USE AdventureWorks2012;
SELECT TOP (2) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
當您按下 ENTER 鍵時,會傳回下列結果集。
BusinessEntityID FirstName LastName
---------------- ------------ ----------
285 Syed Abbas
293 Catherine Abel
(2 row(s) affected)
雖然數據 BusinessEntityID
行只有 4 個字元寬,但已展開以容納較長的數據行名稱。 依預設,輸出的長度最多為 80 個字元。 您可以利用 -w 選項或設定 SQLCMDCOLWIDTH 指令碼變數,變更此設定。
XML 輸出格式
FOR XML 子句所產生的 XML 輸出,會在連續資料流中以未格式化的形式輸出。
當您希望產生 XML 輸出時,請使用下列命令: :XML ON
。
注意
sqlcmd
會以一般格式傳回錯誤訊息。 請注意,錯誤訊息也會以 XML 格式輸出至 XML 文字資料流。 使用 :XML ON
時, sqlcmd
不會顯示參考訊息。
若要關閉 XML 模式,請使用下列命令: :XML OFF
。
因為 XML OFF 命令切換 sqlcmd
回資料列導向輸出,因此不應該在發出 XML OFF 命令之前出現 GO 命令。
XML (資料串流處理) 資料和資料列集資料無法混合。 如果在執行輸出 XML 數據流的 Transact-SQL 語句之前尚未發出 XML ON 命令,輸出將會加碼。 如果已發出 XML ON 命令,則您無法執行輸出一般數據列集的 Transact-SQL 語句。
注意
:XML 命令不支援 SET STATISTICS XML 語句。
sqlcmd 最佳作法
請採用下列作法以提高安全性與效率。
使用整合式安全性。
在自動化環境中使用
-X
。利用 NTFS 檔案系統權限保護輸入檔和輸出檔。
若要提升效能,請盡可能在一個
sqlcmd
會話中執行,而不是在一系列會話中執行。將批次或查詢執行的逾時值,設定成高於您預期執行批次或查詢所需的時間值。
另請參閱
啟動 sqlcmd 公用程式
使用 sqlcmd 執行 Transact-SQL 指令碼檔案
使用 sqlcmd 公用程式
以指令碼變數使用 sqlcmd
使用 sqlcmd 連接至 Database Engine
使用查詢編輯器編輯 SQLCMD 指令碼
管理作業步驟
建立 CmdExec 作業步驟