共用方式為


sqlcmd 公用程式

公用sqlcmd程式可讓您在命令提示字元中,在 SQLCMD 模式的 查詢編輯器、Windows 腳本檔案或 SQL Server Agent 作業的作業系統 (Cmd.exe) 作業步驟中輸入 Transact-SQL 語句、系統程式和腳本檔案。 此公用程式會使用 ODBC 來執行 Transact-SQL 批次。

重要

SQL Server Management Studio 會使用 Microsoft.NET FrameworkSqlClient,在 查詢編輯器以一般和 SQLCMD 模式執行。 從命令行執行 時 sqlcmdsqlcmd 請使用 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 可用性群組中的次要複本。 如需詳細資訊,請參閱 使用中次要:可讀取的次要複本

-Mmultisubnet_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 環境變數;這表示 sqlcmdosql 可以彼此使用,而不會受到干擾,而且舊的腳本會繼續運作。

如果同時使用 -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 環境變數;這表示 sqlcmdosql 可以彼此使用,而不會受到干擾,而且舊的腳本會繼續運作。

-U login_id
這是使用者登入識別碼。

注意

可利用 OSQLUSER 環境變數達到回溯相容性。 SQLCMDUSER 環境變數優先於 OSQLUSER 環境變數。 這表示 sqlcmdosql 可以在彼此旁邊使用,而不會受到干擾。 這也表示現有的 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的檔案。

如果指定 -uoutput_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<=8000

  • nchar(nn ),其中 1<=n<=4000

  • varchar(nn ),其中 1<=n<=8000

  • nvarchar(nn ),其中 1<=n<=4000

  • varbinary(nn ),其中 1<=n<=4000

  • variant

錯誤報告選項
-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。

-Verror_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 發出警告訊息並繼續。 如果指定了選擇性參數 1sqlcmd 則會產生錯誤訊息,然後結束。 使用 -X 選項時,會停用下列命令:

  • ED

  • !!命令

如果指定選項 -X ,它會防止將環境變數傳遞至 sqlcmd。 也無法執行利用 SQLCMDINI 指令碼變數所指定的啟動指令碼。 如需腳本變數的詳細資訊 sqlcmd ,請參閱 搭配腳本變數使用 sqlcmd。

-?
顯示選項的 sqlcmd 語法摘要。

備註

您不需要按照語法區段中顯示的順序使用選項。

傳回多個結果時, sqlcmd 列印批次中每個結果集之間的空白行。 此外,當「<x 個數據列受影響的」> 訊息不適用於執行的語句時,就不會顯示。

若要以互動方式使用 sqlcmd ,請在命令提示字元中輸入 sqlcmd 本主題稍早所述的任一或多個選項。 如需詳細資訊,請參閱 使用 sqlcmd 公用程式

注意

執行 后,-L-Q-Z-i 選項會結束 sqlcmd

命令環境中命令行的總長度 sqlcmd (Cmd.exe),包括所有自變數和展開變數,是由作業系統針對 Cmd.exe 所決定。

變數優先順序 (由低至高)

  1. 系統層級環境變數

  2. 使用者層級環境變數

  3. 執行 之前sqlcmd,在命令提示字元設定命令殼層 (SET X=Y) 。

  4. sqlcmd-v X=Y

  5. :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 命令

除了 內的 sqlcmdTransact-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所指定的檔案、 stderrstdout。 在指令碼中, Error 命令可以重複出現。 根據預設,錯誤輸出會傳送到 stderr

file name
建立和開啟用來接收輸出的檔案。 如果檔案已經存在,它會截斷成零位元組。 如果因為權限或其他原因無法使用,就不會切換輸出,輸出會送往最後指定的目的地或預設目的地。

STDERR
將錯誤輸出切換到 stderr 資料流。 如果它已重新導向,資料流所重新導向的目標會接收這個錯誤輸出。

STDOUT
將錯誤輸出切換到 stdout 資料流。 如果它已重新導向,資料流所重新導向的目標會接收這個錯誤輸出。

:Out < filename| > STDERR| STDOUT
建立並將所有查詢結果重新導向至 filename所指定的檔案、 stderrstdout。 根據預設,輸出會傳送到 stdout。 如果檔案已經存在,它會截斷成零位元組。 在指令碼中, Out 命令可以重複出現。

:P erftrace < filename>| STDERR| STDOUT
建立並將所有效能追蹤資訊重新導向至 filename所指定的檔案、 stderrstdout。 根據預設,效能追蹤輸出會傳送到 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 的 實例 、 instance1myserver,您可以使用下列專案:

: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 作業步驟