除了 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
-
將所有錯誤輸出重新導向至 file name 指定的檔案、至 stderr 或至 stdout。在指令碼中,Error 命令可以重複出現。根據預設,錯誤輸出會傳送到 stderr。
-
file name
-
建立和開啟用來接收輸出的檔案。如果檔案已經存在,它會截斷成零位元組。如果因為權限或其他原因無法使用,就不會切換輸出,輸出會送往最後指定的目的地或預設目的地。
-
STDERR
-
將錯誤輸出切換到 stderr 資料流。如果它已重新導向,資料流所重新導向的目標會接收這個錯誤輸出。
-
STDOUT
-
將錯誤輸出切換到 stdout 資料流。如果它已重新導向,資料流所重新導向的目標會接收這個錯誤輸出。
-
:Out < filename>| STDERR| STDOUT
-
建立並將所有查詢結果重新導向至 file name 指定的檔案、stderr 或 stdout。根據預設,輸出會傳送到 stdout。如果檔案已經存在,它會截斷成零位元組。在指令碼中,Out 命令可以重複出現。
-
:Perftrace < filename>| STDERR| STDOUT
-
建立並將所有效能追蹤資訊重新導向至 file name 指定的檔案、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 格式清單:
不執行批次,然後立即結束,不傳回任何值。
執行批次之後,便結束作業,不傳回任何值。
執行包含查詢的批次,傳回查詢結果之後,便告結束。
如果在 sqlcmd 指令碼內使用 RAISERROR,並引發 127 狀態,sqlcmd 會結束作業,並將訊息識別碼傳回用戶端。例如:
RAISERROR(50001, 10, 127)
這個錯誤會使得 sqlcmd 指令碼結束作業,並將訊息 ID 50001 傳回用戶端。
SQL Server 保留傳回值 -1 至 -99;sqlcmd 定義了下列其他傳回值:
|
傳回值
|
描述
|
|---|
|
-100
|
在選取傳回值之前發生錯誤。
|
|
-101
|
在選取傳回值時,找不到任何資料列。
|
|
-102
|
在選取傳回值時,發生轉換錯誤。
|
-
GO [count]
-
GO 會發出批次結束及執行任何快取的 Transact-SQL 陳述式的信號。指定 count 的值時,快取的陳述式將以單一批次執行 count 次。
-
其他命令
-
-
:r< filename>
-
將 <filename> 指定的檔案中其他 Transact-SQL 陳述式和 sqlcmd 命令,剖析至陳述式快取中。
如果檔案包含的 Transact-SQL 陳述式後面沒有緊接著 GO,您必須在 :r 後面一行輸入 GO。
附註: |
|---|
|
從執行 sqlcmd 之啟動目錄的相對目錄中讀取 <filename>。
|
在發現批次結束字元之後,便會讀取和執行這個檔案。您可以發出多個 :r 命令。這個檔案可包含任何 sqlcmd 命令,其中包括批次結束字元 GO。
附註: |
|---|
|
每次發現 :r 命令時,以互動模式顯示的行數便會加 1。:r 命令會出現在 list 命令的輸出中。
|
-
:Serverlist
-
列出設定在本機的伺服器,以及在網路中進行廣播的伺服器名稱。
-
:Connect
server_name[\instance_name] [-l timeout] [-U user_name [-P password]]
-
連接到 SQL Server 的執行個體。另外,也關閉目前的連接。
逾時選項:
SQLCMDSERVER 指令碼變數會反映目前作用中的連接。
如果沒有指定 timeout,預設值就是 SQLCMDLOGINTIMEOUT 變數的值。
如果只指定 user_name (做為選項,或做為環境變數),則會提示使用者輸入密碼。如果已設定 SQLCMDUSER 或 SQLCMDPASSWORD 環境變數,就不會提示。如果既沒有提供選項,也沒有提供環境變數,就會利用 Windows 驗證模式來登入。例如,若要利用整合式安全性連接 SQL Server (myserver) 的執行個體 instance1,您將使用下列命令:
:connect myserver\instance1
若要利用指令碼變數來連接 myserver 的預設執行個體,您將使用下列命令:
:setvar myusername test
:setvar myservername myserver
:connect $(myservername) $(myusername)
- [:] !!< command>
-
執行作業系統命令。若要執行作業系統命令,請在行首輸入兩個驚歎號 (!!),後面再接著作業系統命令。例如:
:!! Dir
附註: |
|---|
|
這個命令會在執行 sqlcmd 的電腦上執行。
|
-
:XML [ON | OFF]
-
如需詳細資訊,請參閱本主題稍後的「XML 輸出格式」。
-
:Help
-
列出 sqlcmd 命令及各命令的簡短描述。
sqlcmd 檔案名稱
您可以使用 -i 選項或 :r 命令指定 sqlcmd 輸入檔。輸入檔則可以使用 -o 選項或 :Error、:Out 和 :Perftrace 命令予以指定。以下列出使用這些檔案的幾項指導方針:
-
:Error、:Out 和 :Perftrace 應該使用不同的 <filename>。如果使用相同的 <filename>,指令所產生的輸入可能會混合在一起。
-
如果從本機電腦的 sqlcmd 呼叫位於遠端電腦的輸入檔,而檔案中包含磁碟機檔案 (例如 :out c:\OutputFile.txt),便會在本機電腦建立輸出檔案,而不是在遠端伺服器建立。
-
有效的檔案路徑包括:C:\<filename>, \\<Server>\<Share$>\<filename> 和 "C:\Some Folder\<file name>"。如果路徑中有空格,請使用引號。
-
每個新的 sqlcmd 工作階段都會覆寫現有的同名檔案。
參考用訊息
sqlcmd 會列印伺服器所傳送的任何參考用訊息。在下列範例中,執行 Transact-SQL 陳述式之後,會列印一則參考用訊息。
在命令提示字元中,請輸入下列項目:
sqlcmd
At the sqlcmd prompt type:
USE AdventureWorks;
GO
當您按 ENTER 鍵時,會出現下列參考用訊息:「已將資料庫內容變更為 'AdventureWorks'」。
Transact-SQL 查詢的輸出格式
sqlcmd 會先列印包含選取清單所指定之資料行名稱的資料行標頭。資料行名稱是以 SQLCMDCOLSEP 字元分隔。根據預設,這是一個空格。如果資料行名稱長度小於資料行寬度,便會在輸出中填補空格直到下一個資料行。
這一行後面會接著一條由虛線字元組成的分隔線。下列輸出顯示一個範例。
啟動 sqlcmd。在 sqlcmd 命令提示字元中,輸入下列命令:
USE AdventureWorks;
SELECT TOP (2) ContactID, FirstName, LastName
FROM Person.Contact;
GO
當您按 ENTER 鍵時,會傳回下列結果集。
ContactID FirstName LastName
----------- ------------ ----------
1 Syed Abbas
2 Catherine Abel
(2 row(s) affected)
雖然 ContactID 資料行的寬度只有 4 個字元,但它已擴充,能夠容納較長的資料行名稱。依預設,輸出的長度最多為 80 個字元。您可以利用 -w 選項或設定 SQLCMDCOLWIDTH 指令碼變數來加以變更。
XML 輸出格式
FOR XML 子句所產生的 XML 輸出,會在連續資料流中以未格式化的形式輸出。
當您希望產生 XML 輸出時,請使用下列命令::XML ON。
附註: |
|---|
sqlcmd 會以一般格式傳回錯誤訊息。請注意,錯誤訊息也會以 XML 格式輸出至 XML 文字資料流。如果使用 :XML ON,sqlcmd 就不會顯示參考用訊息。
|
若要將 XML 模式設定為關閉,請使用下列命令::XML OFF。
在發出 XML OFF 命令之前,不應出現 GO 命令,因為 XML OFF 命令會將 sqlcmd 切換回資料列導向的輸出。
XML (資料流) 資料和資料列集不能混合。如果在執行輸出 XML 資料流的 Transact-SQL 陳述式之前發出 XML ON 命令,輸出會混亂。如果已發出 XML ON 命令,您就不能執行輸出正規資料列集的 Transact-SQL 陳述式。
附註: |
|---|
|
:XML 命令不支援 SET STATISTICS XML 陳述式。
|