引用自微軟MSDN:http://msdn.microsoft.com/zh-cn/library/ms162773.aspx
一、輸入?yún)?shù)
[注釋]:
不必按語法部分所示的順序使用選項。
在返回多個結(jié)果時,sqlcmd 在批處理中的每個結(jié)果集之間輸出一個空行。此外,如果沒有應(yīng)用于已執(zhí)行的語句,則“<x> 行受影響”消息不會出現(xiàn)。
若要交互使用 sqlcmd,請在命令提示符處使用本主題前面介紹的一個或多個選項鍵入 sqlcmd。有關(guān)詳細信息,請參閱使用 sqlcmd 實用工具。
注意: |
---|
-L、-Q、-Z 或 -i 選項會導致 sqlcmd 在完成執(zhí)行后退出。 |
除 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 命令必須以冒號 (:) 為前綴。
![]() |
---|
為了保持現(xiàn)有 osql 腳本的向后兼容性,有些命令會被視為不帶冒號。這由 [:] 指示。 |
sqlcmd 命令只有出現(xiàn)在一行的開頭時,才能夠被識別。
所有 sqlcmd 命令都不區(qū)分大小寫。
每個命令都必須位于單獨的行中。命令后面不能跟隨 Transact-SQL 語句或其他命令。
命令將被立即執(zhí)行。它們與 Transact-SQL 語句不同,不會放在執(zhí)行緩沖區(qū)中。
編輯命令
[:] ED
啟動文本編輯器。該編輯器可以用來編輯當前的 Transact-SQL 批處理或上次執(zhí)行的批處理。若要編輯上次執(zhí)行的批處理,必須在上一批處理執(zhí)行完之后立即鍵入 ED 命令。
文本編輯器由 SQLCMDEDITOR 環(huán)境變量定義。默認編輯器為“Edit”。若要更改編輯器,請設(shè)置 SQLCMDEDITOR 環(huán)境變量。例如,若要將編輯器設(shè)置為 Microsoft 記事本,請在命令提示符處鍵入:
DE>SET SQLCMDEDITOR=notepadDE>
[:] RESET
清除語句緩存。
:List
輸出語句緩存的內(nèi)容。
變量
:Setvar <var> [ 'value' ]
定義 sqlcmd 腳本變量。腳本變量具有如下格式:DE>$(VARNAME)DE>。
變量名稱不區(qū)分大小寫。
可以通過下列方式設(shè)置腳本變量:
隱式使用命令行選項。例如,-l 選項設(shè)置 SQLCMDLOGINTIMEOUT sqlcmd 變量。
顯式使用 :Setvar 命令。
在運行 sqlcmd 之前定義一個環(huán)境變量。
![]() |
---|
-X 選項可防止將環(huán)境變量傳遞給 sqlcmd。 |
如果使用 :Setvar 定義的變量和某個環(huán)境變量同名,則使用 :Setvar 定義的變量優(yōu)先。
變量名中不能包含空格字符。
變量名不能與變量表達式(如 $(var))具有相同的形式。
如果腳本變量的字符串值中含有空格,請用引號將該值引起來。如果未指定腳本變量的值,則將刪除該腳本變量。
:Listvar
顯示當前設(shè)置的腳本變量列表。
![]() |
---|
只顯示由 sqlcmd 設(shè)置的腳本變量和使用 :Setvar 命令設(shè)置的腳本變量。 |
輸出命令
:Error < filename >| STDERR|STDOUT
將所有錯誤輸出重定向到 file name 指定的文件、stderr 或 stdout。Error 命令可以在一個腳本中多次出現(xiàn)。默認情況下,錯誤輸出將發(fā)送到 stderr。
file name
創(chuàng)建并打開一個要接收輸出的文件。若該文件已經(jīng)存在,則將其截斷為零字節(jié)。若該文件不可用(由于權(quán)限或其他原因),將不會切換輸出,也不會將輸出發(fā)送到上次指定的目標或默認目標。
STDERR
將錯誤輸出切換至 stderr 流。如果已經(jīng)重定向,流的重定向目標將會收到錯誤輸出。
STDOUT
將錯誤輸出切換至 stdout 流。如果已經(jīng)重定向,流的重定向目標將會收到錯誤輸出。
:Out < filename>| STDERR| STDOUT
創(chuàng)建所有查詢結(jié)果并將它們重定向到 file name 指定的文件、stderr 或 stdout。默認情況下,輸出將發(fā)送到 stdout。若該文件已經(jīng)存在,則將其截斷為零字節(jié)。Out 命令可以在一個腳本中多次出現(xiàn)。
:Perftrace < filename>| STDERR| STDOUT
創(chuàng)建所有性能跟蹤信息并將它們重定向到 file name 指定的文件、stderr 或 stdout。默認情況下,性能跟蹤輸出將發(fā)送到 stdout。若該文件已經(jīng)存在,則將其截斷為零字節(jié)。Perftrace 命令可以在一個腳本中多次出現(xiàn)。
執(zhí)行控制命令
:On Error[ exit | ignore]
設(shè)置在腳本或批處理執(zhí)行過程中發(fā)生錯誤時要執(zhí)行的操作。
使用 exit 選項時,sqlcmd 退出,并顯示相應(yīng)的錯誤值。
使用 ignore 選項時,sqlcmd 會忽略錯誤,并繼續(xù)執(zhí)行批處理或腳本。默認情況下,會輸出錯誤消息。
[:] QUIT
導致 sqlcmd 退出。
[:] EXIT[ (statement) ]
允許您將 SELECT 語句的結(jié)果用作 sqlcmd 的返回值。第一個結(jié)果行的第一列轉(zhuǎn)換為 4 字節(jié)的整數(shù)(長整型)。MS-DOS 將低字節(jié)傳遞給父進程或操作系統(tǒng)錯誤級別。Windows 200x 傳遞整個 4 字節(jié)整數(shù)。語法為:
DE>:EXIT(query)DE>
例如:
DE>:EXIT(SELECT @@ROWCOUNT)DE>
您還可以在批處理文件中包含 EXIT 參數(shù)。例如,在命令提示符處鍵入:
DE>sqlcmd -Q 'EXIT(SELECT COUNT(*) FROM '%1')'DE>
sqlcmd 實用工具將圓括號 ( ) 中的所有內(nèi)容發(fā)送給服務(wù)器。如果系統(tǒng)存儲過程選擇了一個集合并返回一個值,則僅返回選擇的內(nèi)容。如果圓括號中沒有任何內(nèi)容,則 EXIT ( ) 語句會執(zhí)行批處理中此語句前的所有內(nèi)容,然后退出,且不返回任何值。
當指定了錯誤查詢時,sqlcmd 將退出,且不返回任何值。
下面是 EXIT 格式的列表:
:EXIT
不執(zhí)行批處理就立即退出,無返回值。
:EXIT( )
執(zhí)行批處理后退出,不返回值。
:EXIT(query)
執(zhí)行包括查詢的批處理,返回查詢的結(jié)果后退出。
如果在 sqlcmd 腳本中使用 RAISERROR,并且出現(xiàn)狀態(tài) 127,則 sqlcmd 將退出,并將消息 ID 返回給客戶端。例如:
DE>RAISERROR(50001, 10, 127)DE>
該錯誤會導致 sqlcmd 腳本終止并將消息 ID 50001 返回給客戶端。
SQL Server 保留了介于 -1 到 -99 之間的返回值;sqlcmd 定義了以下附加返回值:
返回值 | 說明 |
---|---|
-100 | 選擇返回值前遇到錯誤。 |
-101 | 選擇返回值時找不到行。 |
-102 | 選擇返回值時發(fā)生轉(zhuǎn)換錯誤。 |
GO [count]
GO 在批處理和執(zhí)行任何緩存 Transact-SQL 語句結(jié)尾時會發(fā)出信號。在為 count 指定一個值時,緩存的語句會被作為單個批處理執(zhí)行 count 次。
其他命令
:r < filename>
將來自通過 <filename>所指定文件的其他 Transact-SQL 語句和 sqlcmd 命令分析到語句緩存中。
如果文件包含的 Transact-SQL 語句后面沒有跟隨 GO,則必須在 :r 的后一行中輸入 GO。
![]() |
---|
系統(tǒng)會相對于 sqlcmd 在其中運行的啟動目錄讀取 <filename>。 |
當遇到批處理終止符之后,將讀取并執(zhí)行該文件。可以發(fā)出多個 :r 命令。該文件可以包含任何 sqlcmd 命令。包括批處理終止符 GO。
![]() |
---|
每遇到一個 :r 命令,交互模式下顯示的行計數(shù)都會加一。:r 命令會出現(xiàn)在 list 命令的輸出中。 |
:Serverlist
列出在本地配置的服務(wù)器和在網(wǎng)絡(luò)上廣播的服務(wù)器的名稱。
:Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]]
連接到 SQL Server 的一個實例。同時關(guān)閉當前的連接。
超時選項:
0 | 永遠等待 |
n>0 | 等待 n 秒鐘 |
SQLCMDSERVER 腳本變量將反映當前的活動連接。
如果未指定 timeout,則其默認值將為 SQLCMDLOGINTIMEOUT 變量的值。
僅當指定了 user_name(作為選項或環(huán)境變量)時,才會提示用戶輸入密碼。如果已設(shè)置 SQLCMDUSER 或 SQLCMDPASSWORD 環(huán)境變量,則不會出現(xiàn)此提示。如果既未提供選項,又未提供環(huán)境變量,則使用 Windows 身份驗證模式登錄。例如,若要使用集成安全性連接到 SQL Server DE>myserverDE> 的一個實例(如 DE>instance1DE>),則會使用以下內(nèi)容:
DE>:connect myserver\instance1DE>
若要使用腳本變量連接到 DE>myserverDE> 的默認實例,您會使用以下內(nèi)容:
DE>:setvar myusername testDE>
DE>:setvar myservername myserverDE>
DE>:connect $(myservername) $(myusername)DE>
[:] !!< command>
執(zhí)行操作系統(tǒng)命令。若要執(zhí)行操作系統(tǒng)命令,請用兩個感嘆號 (!!) 開始一行,后面輸入操作系統(tǒng)命令。例如:
DE>:!! DirDE>
![]() |
---|
該命令在運行 sqlcmd 的計算機上執(zhí)行。 |
:XML [ON | OFF]
有關(guān)詳細信息,請參閱本主題后面的“XML 輸出格式”
:Help
列出 sqlcmd 命令以及每個命令的簡短說明。
可以使用 -i 選項或 :r 命令指定 sqlcmd 輸入文件。可以使用 -o 選項或 :Error、:Out 和 :Perftrace 命令指定輸出文件。以下是使用這些文件的一些原則:
:Error、:Out 和 :Perftrace 應(yīng)使用不同的 <filename>。如果使用了相同的 <filename>,這些命令的輸入可能會混雜在一起。
如果從本地計算機的 sqlcmd 調(diào)用遠程服務(wù)器上的輸入文件,并且該文件包含驅(qū)動器文件路徑(如 :out c:\OutputFile.txt),將在本地計算機而不是遠程服務(wù)上創(chuàng)建輸出文件。
有效的文件路徑包括:C:\<filename>、\\<服務(wù)器>\<共享$>\<filename> 和 'C:\Some Folder\<file name>'。如果路徑中包含空格,請使用引號。
每個新的 sqlcmd 會話都將覆蓋現(xiàn)有的同名文件。
sqlcmd 將輸出由服務(wù)器發(fā)送的所有信息性消息。在以下示例中,執(zhí)行 Transact-SQL 語句后會輸出信息性消息。
在命令提示符下鍵入以下內(nèi)容:
DE>sqlcmdDE>
DE>At the sqlcmd prompt type:DE>
DE>USE AdventureWorks;DE>
DE>GODE>
按下 Enter 時,會輸出以下信息性消息:“已將數(shù)據(jù)庫上下文改為 'AdventureWorks'?!?/p>
sqlcmd 首先輸出列標題,其中包含在選擇列表中指定的列名。列名使用 SQLCMDCOLSEP 字符分隔。默認情況下,將使用空格。如果列名短于列寬,則使用空格填充輸出,直到下一列。
此行將跟隨一行分隔行,分隔行是一系列的破折號字符。以下輸出顯示了一個示例。
啟動 sqlcmd。在 sqlcmd 命令提示符下鍵入以下內(nèi)容:
DE>USE AdventureWorks;DE>
DE>SELECT TOP (2) ContactID, FirstName, LastName DE>
DE>FROM Person.Contact;DE>
DE>GO DE>
按下 Enter 時,會返回以下結(jié)果集。
DE>ContactID FirstName LastName DE>
DE>----------- ------------ ----------DE>
DE>1 Syed AbbasDE>
DE>2 Catherine AbelDE>
DE>(2 row(s) affected)DE>
雖然 DE>ContactIDDE> 列只有 4 個字符寬,但已將其擴展以適應(yīng)更長的列名。默認情況下,輸出會在 80 個字符處終止。可通過使用 -w 選項或設(shè)定 SQLCMDCOLWIDTH 腳本變量來進行更改。
從 FOR XML 子句得到的 XML 輸出是在連續(xù)流中的未格式化的輸出。
若要得到 XML 輸出,請使用以下命令:DE>:XML ONDE>。
![]() |
---|
sqlcmd 將采用常見的格式返回錯誤消息。請注意,XML 文本流中的錯誤消息還將采用 XML 格式輸出。如果使用 DE>:XML ONDE>,則 sqlcmd 不顯示信息性消息。 |
若要關(guān)閉 XML 模式,請使用以下命令:DE>:XML OFFDE>。
發(fā)出 XML OFF 命令之前不應(yīng)顯示 GO 命令,因為 XML OFF 命令會將 sqlcmd 切換回面向行的輸出。
XML(流形式)數(shù)據(jù)和行集數(shù)據(jù)不能混合。如果在執(zhí)行輸出 XML 流的 Transact-SQL 語句之前未發(fā)出 XML ON 命令,則輸出將為亂碼。如果已發(fā)出 XML ON 指令,則無法執(zhí)行輸出常規(guī)行集的 Transact-SQL 語句。
![]() |
---|
:XML 命令不支持 SET STATISTICS XML 語句。 |
使用以下方法來幫助實現(xiàn)最高的安全性和效率。
使用集成安全性。
在自動化環(huán)境中使用 -X。
使用適當?shù)?NTFS 文件系統(tǒng)權(quán)限保護輸入文件和輸出文件。
若要提高性能,請在一個 sqlcmd 會話中執(zhí)行盡可能多的操作,而不是在一系列會話中來執(zhí)行這些操作。
將批處理或查詢執(zhí)行的超時值設(shè)置為大于您所預(yù)期的值。