osql 公用程式
osql 公用程式可讓您輸入 Transact-SQL 陳述式、系統程序和指令碼檔案。這個公用程式利用 ODBC 來與伺服器通訊。
重要事項 |
---|
SQL Server 的未來版本將移除此功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。請改用 sqlcmd。如需詳細資訊,請參閱<sqlcmd 公用程式>。 |
語法
osql
[-?] |
[-L] |
[
{
{-Ulogin_id [-Ppassword]} | –E }
[-Sserver_name[\instance_name]] [-Hwksta_name] [-ddb_name]
[-ltime_out] [-ttime_out] [-hheaders]
[-scol_separator] [-wcolumn_width] [-apacket_size]
[-e] [-I] [-D data_source_name]
[-ccmd_end] [-q "query"] [-Q"query"]
[-n] [-merror_level] [-r {0 | 1}]
[-iinput_file] [-ooutput_file] [-p]
[-b] [-u] [-R] [-O]
]
引數
-?
顯示 osql 參數的語法摘要。-L
列出設定在本機的伺服器,以及在網路中進行廣播的伺服器名稱。[!附註]
由於網路廣播的本質,osql 可能不會收到所有伺服器的及時回應。因此,這個選項各自的引動過程中,傳回的伺服器清單可能各不相同。
-Ulogin_id
這是使用者登入識別碼。登入識別碼會區分大小寫。-Ppassword
這是一個使用者指定的密碼。如果未使用 -P 選項,osql 會提示輸入密碼。如果在命令提示字元的尾端使用 -P 選項,且沒有任何密碼,osql 會使用預設密碼 (NULL)。安全性注意事項 請勿使用空白密碼。請使用增強式密碼。如需詳細資訊,請參閱<增強式密碼>。
密碼會區分大小寫。
OSQLPASSWORD 環境變數可讓您設定目前工作階段的預設密碼。因此,您不需要將密碼寫在批次檔中。
如果您沒有用 -P 選項來指定密碼,osql 會先檢查 OSQLPASSWORD 變數。如果沒有設定任何值,osql 會使用預設密碼 NULL。下列範例會在命令提示字元之下設定 OSQLPASSWORD 變數,再存取 osql 公用程式:
C:\>SET OSQLPASSWORD=abracadabra C:\>osql
安全性注意事項 若要遮罩您的密碼,請勿連同 -U 選項來指定 -P 選項。相反地,請在指定 osql 連同 -U 選項及其他參數 (不可指定 -P) 之後,按 ENTER 鍵,此時 osql 會提示您輸入密碼。這個方法可確保在輸入密碼時,遮罩您的密碼。
-E
使用信任連接,不要求密碼。-Sserver_name[ **\instance_name]
指定要連接的 SQL Server 執行個體。指定 server_name 來連接這部伺服器中的 SQL Server 預設執行個體。指定 server_name\**instance_name 來連接該伺服器上 SQL Server 的具名執行個體。如果未指定伺服器的話,osql 會連接到本機電腦中的 SQL Server 預設執行個體。當從網路中的遠端電腦執行 osql 時,需要這個選項。-Hwksta_name
這是一個工作站名稱。工作站名稱儲存在 sysprocesses.hostname 中,sp_who 會顯示它。如果未指定這個選項,就會假設目前的電腦名稱。-ddb_name
在啟動 osql 時,發出 USE db_name 陳述式。-ltime_out
指定在 osql 登入逾時之前的秒數。登入 osql 的預設逾時值是 8 秒。-ttime_out
指定命令逾時之前的秒數。如果未指定 time_out 值,命令不會逾時。-hheaders
指定資料行標頭之間所要列印的資料列數。預設值是每一組查詢結果各列印一次標頭。請利用 -1 來指定不列印任何標頭。如果使用 –1,參數和設定之間不能有空格 (請設定 -h-1,不能使用 -h -1)。-scol_separator
指定資料行分隔字元,依預設,它是一個空格。若要使用對作業系統有特殊意義的字元 ( 如 | ; & < >),請用雙引號 (") 括住該字元。-wcolumn_width
可讓使用者設定輸出的螢幕寬度。預設值是 80 個字元。當輸出行到達最大螢幕寬度時,它會折成多行。-apacket_size
可讓您要求不同大小的封包。packet_size 的有效值為 512 到 65535。預設值 osql 為伺服器預設值。當 GO 命令之間有很多 SQL 陳述式時,增加封包大小可以增強較大型指令碼執行的效能。Microsoft 測試指出在大量複製作業上,8192 通常是最快的設定。您可以要求較大的封包,但如果無法授與要求,osql 會預設為伺服器預設值。-e
回應輸入。-I
將 QUOTED_IDENTIFIER 連接選項設為開啟。-Ddata_source_name
連接到 SQL Server 的 ODBC 驅動程式所定義的 ODBC 資料來源。osql 連接會使用資料來源所指定的選項。[!附註]
這個選項不會使用定義給其他驅動程式的資料來源。
-ccmd_end
指定命令結束字元。依預設,在一行中單獨輸入 GO,便會終止命令,並將命令傳給 SQL Server。當您重設命令結束字元時,請勿使用對作業系統有特殊意義的 Transact-SQL 保留字或字元,不論前面是否附加了反斜線,都是一樣。-q "query"
啟動 osql 時便執行查詢,但查詢完成時,osql 不會結束。(請注意,查詢陳述式不應包含 GO)。如果您是從批次檔中發出查詢,請使用變數 (%variables) 或環境變數 (%variables%)。例如:SET table=sys.objects osql -E -q "select name, object_id from %table%"
請利用雙引號括住查詢,利用單引號括住內嵌在查詢中的任何項目。
-Q"query"
執行查詢並立即結束 osql。請利用雙引號括住查詢,利用單引號括住內嵌在查詢中的任何項目。-n
從輸入行中,移除編號和提示符號 (>)。-merror_level
自訂錯誤訊息的顯示畫面。指定嚴重性層級以上 (含) 的錯誤時,會顯示訊息編號、狀態和錯誤層級。在指定層級以下的錯誤不會顯示任何資訊。請利用 -1 來指定訊息傳回所有標頭,即使參考訊息也是如此。如果使用 -1,參數和設定之間不能有空格 (請設定 -m-1,不能使用 -m -1)。-r { 0| 1}
將訊息輸出重新導向至畫面 (stderr)。如果您沒有指定參數,或您指定 0,便只會重新導向嚴重性層級 11 或更高層級的錯誤訊息。如果您指定 1,便會重新導向所有訊息輸出 (包括 "print")。-iinput_file
識別 SQL 陳述式或預存程序的批次所在的檔案。小於 (<) 比較運算子可用來代替 -i。-ooutput_file
識別用來接收 osql 輸出的檔案。大於 (>) 比較運算子可用來代替 -o。如果 input_file 不是 Unicode 且沒有指定 -u,output_file 會以 OEM 格式儲存。如果 input_file 是 Unicode,或是指定了 -u,output_file 會以 Unicode 格式儲存。
-p
列印效能統計資料。-b
指定在發生錯誤時,osql 結束作業並傳回 DOS ERRORLEVEL 值。當 SQL Server 錯誤訊息的嚴重性層級大於或等於 11 時,傳回 DOS ERRORLEVEL 變數的值是 1;否則,傳回的值是 0。Microsoft MS-DOS 批次檔可以測試 DOS ERRORLEVEL 的值,而且能夠適當處理錯誤。-u
指定不論 input_file 的格式如何,output_file 均以 Unicode 格式儲存。-R
指定在將貨幣、日期和時間資料轉換成字元資料時,SQL Server ODBC 驅動程式要使用用戶端設定。-O
指定停用某些 osql 功能,以符合舊版 isql 的行為。停用的功能如下:EOF 批次處理
自動調整主控台寬度
寬字訊息
它也會將預設的 DOS ERRORLEVEL 值設為 -1。
[!附註]
osql 已不再支援 -n、-O 和 -D 選項。
備註
osql 公用程式是在設定了這裡所列出的區分大小寫之選項的情況下,直接從作業系統中啟動。osql啟動之後,它會接受 SQL 陳述式,且會以互動方式將它們傳給 SQL Server。結果會格式化,顯示在畫面中 (stdout)。請利用 QUIT 或 EXIT 來結束 osql。
如果您在啟動 osql 時沒有指定使用者名稱,SQL Server 會檢查及使用類似 osqluser=(user) 或 osqlserver=(server) 等環境變數。如果未設定任何環境變數,就會使用工作站使用者名稱。如果您沒有指定伺服器,就會使用工作站的名稱。
如果 -U 或 -P 選項都沒有使用,SQL Server 會嘗試利用 Microsoft Windows 驗證模式來進行連接。這項驗證以執行 osql 之使用者的 Microsoft Windows 帳戶為基礎。
osql 公用程式會使用 ODBC API。這個公用程式會使用 SQL Server ISO 連接選項的 SQL Server ODBC 驅動程式預設值。如需詳細資訊,請參閱<ANSI 選項的作用>。
[!附註]
osql 公用程式不支援 CLR 使用者定義資料類型。若要處理這些資料類型,您必須使用 sqlcmd 公用程式。如需詳細資訊,請參閱<sqlcmd 公用程式>。
OSQL 命令
除了 osql 內的 Transact-SQL 陳述式,您也可以使用這些命令。
命令 |
說明 |
---|---|
GO |
執行在上一個 GO 之後輸入的所有陳述式。 |
RESET |
清除您已輸入的任何陳述式。 |
QUIT 或 EXIT( ) |
結束 osql。 |
CTRL+C |
結束查詢,但不結束 osql。 |
[!附註]
osql 不再支援 !! 和 ED 命令。
命令結束字元 GO (預設)、RESET EXIT、QUIT 和 CTRL+C 必須在行首,緊接在 osql 提示之後,才能夠辨識。
GO 會發出批次結束及執行任何快取 Transact-SQL 陳述式的信號。當您在每個輸入行結束而按下 ENTER 鍵時,osql 會快取這一行的陳述式。當您在輸入 GO 之後按下 ENTER 鍵時,會將目前所快取的所有陳述式做為單一批次傳給 SQL Server。
目前的 osql 公用程式的運作方式,如同在任何執行的指令碼尾端有隱含的 GO,因此會執行指令碼中的所有陳述式。
請在行首輸入命令結束字元來結束命令。您可以在命令結束字元之後,輸入一個整數來指定命令應該執行的次數。例如,若要執行這個命令 100 次,請輸入:
SELECT x = 1
GO 100
執行結束時,會列印結果一次。osql 不接受每行超出 1,000 個字元。大型陳述式應該分成幾行。
Windows 的命令重新呼叫功能可用來重新呼叫及修改 osql 陳述式。您可以輸入 RESET 來清除現有的查詢緩衝區。
當執行預存程序時,osql 會在批次的各組結果之間,列印一道空行。另外,當「0 個資料列受影響」的訊息不適合執行的陳述式時,便不會出現這則訊息。
以互動方式使用 osql
若要以互動方式來使用 osql,請在命令提示字元之下,輸入 osql 命令 (及任何選項)。
您可以輸入類似下列的命令來讀取包含查詢 (如 Stores.qry) 的檔案,供 osql 執行:
osql -E -i stores.qry
您可以輸入類似下列的命令來讀取包含查詢 (如 Titles.qry) 的檔案,以及將結果導向另一個檔案:
osql -E -i titles.qry -o titles.res
安全性注意事項 |
---|
可能的話,請使用 -E 選項 (信任連接)。 |
當以互動方式使用 osql 時,您可以利用 :rfile_name,將作業系統檔案讀到命令緩衝區中。這會將 file_name 中的 SQL 指令碼當做單一批次直接傳給伺服器。
[!附註]
當使用 osql 時,如果批次分隔字元 GO 出現在 SQL 指令碼檔案中,SQL Server 會將它視為語法錯誤。
插入註解
您可以在 osql 提交給 SQL Server 的 Transact-SQL 陳述式中併入註解。可用的註解樣式有兩種:-- 和 /*...*/。
如需詳細資訊,請參閱<使用註解>。
在 osql 中利用 EXIT 傳回結果
您可以利用 SELECT 陳述式的結果來做為 osql 的傳回值。如果為數值,最後一個結果資料列的最後一個資料行會轉換成 4 位元組的整數 (long)。MS-DOS 會將低位元組傳給父處理序或作業系統錯誤層級。Windows 會傳遞整個 4 位元組整數。語法如下:
EXIT ( < query > )
例如:
EXIT(SELECT @@ROWCOUNT)
您也可以將 EXIT 參數併入批次檔中。例如:
osql -E -Q "EXIT(SELECT COUNT(*) FROM '%1')"
osql 公用程式會將 ( ) 括號之間的任何內容,完全依照輸入的原狀傳給伺服器。如果預存的系統程序選取某一組,傳回某個值,此時只會傳回選取的項目。括號之間沒有任何內容的 EXIT**()** 陳述式,會執行批次中在它前面的任何內容,之後,便結束作業,不傳回任何值。
EXIT 有四種格式:
- EXIT
[!附註]
不執行批次;立即結束,不傳回任何值。
- EXIT**()**
[!附註]
執行批次之後,便結束作業,不傳回任何值。
- EXIT**(query)**
[!附註]
執行包含查詢的批次,傳回查詢結果之後,便告結束。
- 狀態為 127 的 RAISERROR
[!附註]
如果在 osql 指令碼內使用 RAISERROR,且產生 127 狀態,osql 會結束作業,且會將訊息識別碼傳回用戶端。例如:
RAISERROR(50001, 10, 127)
這個錯誤會使得 osql 指令碼結束作業,並將訊息識別碼 50001 傳回用戶端。
SQL Server 保留傳回值 -1 至 -99;osql 定義了下列值:
-100
在選取傳回值之前發生錯誤。
-101
在選取傳回值時,找不到任何資料列。
-102
在選取傳回值時,發生轉換錯誤。
顯示 money 和 smallmoney 資料類型
osql 會顯示兩位數的 money 和 smallmoney 資料類型,不過,SQL Server 會在內部利用四位數來儲存這個值。請設想下列範例:
SELECT CAST(CAST(10.3496 AS money) AS decimal(6, 4))
GO
這個陳述式會產生 10.3496 的結果,這表示在儲存值時,所有小數點保留不動。