使用 osql 實用工具,可以輸入 Transact-SQL 語句、系統過程和腳本文件。 此實用工具通過 ODBC 與服務器通信。
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 可能不會及時接收來自所有服務器的響應。 因此,每次調用該選項所返回的服務器列表都可能不同。
-U login_id
用戶登錄 ID。 登錄 ID 區分大小寫。
-P password
用戶指定的密碼。 如果未使用 -P 選項,osql 將提示輸入密碼。 如果在命令提示符的末尾使用 -P 選項而不提供密碼,osql 將使用默認密碼 (NULL)。
安全說明
不要使用空密碼。 請使用強密碼。 有關詳細信息,請參閱強密碼。
密碼是區分大小寫的。
使用 OSQLPASSWORD 環境變量,可以為當前會話設置默認密碼。 因此,不需要通過硬編碼在批處理文件中設置密碼。
如果不使用 -P 選項指定密碼,osql 將首先檢查 OSQLPASSWORD 變量。 如果未設置任何值,則 osql 將使用默認密碼 (NULL)。 以下示例將在命令提示符中設置 OSQLPASSWORD 變量,然后訪問 osql 實用工具:
復制
C:\>SET OSQLPASSWORD=abracadabra
C:\>osql
安全說明
若要屏蔽密碼,請不要同時指定 -P 和 -U 選項。 相反,應在指定 osql 和 -U 選項和其他開關(不指定 -P)之后,按 Enter 鍵,此時 osql 將提示您輸入密碼。 這種方法可以確保輸入密碼時對其屏蔽。
-E
使用可信連接而不請求密碼。
-S server_name[ **\instance_name]
指定要連接到的 SQL Server 實例。 指定 server_name 將連接到該服務器上的 SQL Server 默認實例。 指定 server_name\**instance_name 將連接到該服務器中的 SQL Server 的命名實例。 如果未指定服務器,osql 將連接到本地計算機上的 SQL Server 默認實例。 從網絡上的遠程計算機執行 osql 時,此選項是必需的。
-H wksta_name
工作站的名稱。 工作站名稱存儲在 sysprocesses.hostname 中,并按 sp_who 顯示。 如果不指定此選項,則采用當前計算機名稱。
-d db_name
啟動 osql時發出一個 USE db_name 語句。
-l time_out
指定 osql 登錄超時之前的秒數。 登錄到 osql 的默認超時時間為 8 秒。
-t time_out
指定命令超時之前的秒數。 如果未指定 time_out 值,則命令將不會超時。
-h headers
指定要在列標題之間打印的行數。 默認為每一組查詢結果打印一次標題。 使用 -1 可指定不打印標題。 如果使用 -1,則在參數和設置之間一定不能有空格(可以是 -h-1,不能是 -h -1)。
-s col_separator
指定列分隔符字符,默認值為空格。 若要使用對操作系統有特殊含義的字符(例如 | ; & < >),請將該字符用雙引號 (") 括起來。
-w column_width
允許用戶設置屏幕輸出的寬度。 默認為 80 個字符。 當輸出行達到其最大屏幕寬度時,會拆分為多行。
-a packet_size
允許您請求不同大小的數據包。 packet_size 的有效值介于 512 和 65535 之間。 默認值 osql 是服務器默認值。 執行較大的腳本時,各個 GO 命令之間的 SQL 語句的數量是龐大的,因此增大數據包可以提高性能。 Microsoft 的測試表明大容量復制操作的最快設置通常為 8192。 可以請求更大的數據包,但如果請求不能得到批準,則 osql 會將此值默認為服務器的默認值。
-e
回顯輸入。
-I
將 QUOTED_IDENTIFIER 連接選項設置為開啟。
-D data_source_name
連接到某個通過用于 SQL Server 的 ODBC 驅動程序定義的 ODBC 數據源。 osql 連接使用該數據源中指定的選項。
注意
此選項不適用于為其他驅動程序定義的數據源。
-c cmd_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
從輸入行中刪除編號和提示符號 (>)。
-m error_level
自定義錯誤消息的顯示。 顯示指定的或更高嚴重級別的錯誤的消息數、狀態和錯誤級別。 不顯示低于指定級別的錯誤的信息。 使用 -1 可以指定返回所有標題及其消息,即使是信息型消息。 如果使用 -1,則在參數和設置之間不能有空格(可以是 -m-1,不能是 -m -1)。
-r { 0| 1}
將消息輸出重定向到屏幕 (stderr)。 如果不指定參數,或指定參數為 0,則僅重定向嚴重級別為 11 或更高的錯誤信息。 如果指定參數為 1,則將重定向所有消息輸出(包括“print”)。
-i input_file
標識包含一批 SQL 語句或存儲過程的文件。 小于 (<) 比較運算符可以代替 -i 使用。
-o output_file
標識從 osql 接收輸出的文件。 大于 (>) 比較運算符可以代替 -o 使用。
如果 input_file 不是 Unicode 并且未指定 -u,則以 OEM 格式存儲 output_file。 如果 input_file 是 Unicode 或者指定了 -u,則以 Unicode 格式存儲 output_file。
-p
打印性能統計信息。
-b
指定發生錯誤時,osql 退出并返回一個 DOS ERRORLEVEL 值。 當 SQL Server 錯誤消息的嚴重級別為 11 或更大值時,返回給 DOS ERRORLEVE 變量的值為 1;否則返回的值為 0。 Microsoft MS-DOS 批處理文件可以測試 DOS ERRORLEVEL 的值并正確地處理錯誤。
-u
指定無論 input_file 為何種格式,output_file 都以 Unicode 格式進行存儲。
-R
指定在將貨幣、日期和時間數據轉換為字符數據時,SQL Server ODBC 驅動程序使用客戶端設置。
-O
指定停用某些 osql 功能以便與 isql 的早期版本的行為匹配。 下列功能停用:
同時還將 DOS ERRORLEVEL 的默認值設置為 -1。
EOF 批處理
自動調整控制臺寬度
寬消息
注意
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。
注意
!! 和 ED 命令 不再受 osql 支持。
僅當命令終止符 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 命令(以及任何選項)。
通過鍵入類似下面的命令,可以讀入一個包含由 osql 執行的查詢的文件(例如 Stores.qry):
復制
osql -E -i stores.qry
通過鍵入類似下面的命令,可以讀入包含查詢的文件(如 Titles.qry),并將結果導向其他文件:
復制
osql -E -i titles.qry -o titles.res
安全說明
如果可能,請使用 -E選項(可信連接)。
以交互方式使用 osql 時,若要將操作系統文件讀入命令緩沖區,可使用 :r file_name。 這會將 file_name 中的 SQL 腳本作為一個批處理直接發送給服務器。
注意
使用 osql 時,如果批處理分隔符“GO”出現在 SQL 腳本文件中,則 SQL Server 會將其視為語法錯誤。
插入注釋
可以在 osql 提交給 SQL Server 的 Transact-SQL 語句中包含注釋。 允許使用兩種類型的注釋樣式:-- 和 /*...*/。
使用 EXIT 返回 osql 中的結果
可以使用 SELECT 語句的結果作為 osql 的返回值。 如果為數值,則最后一個結果行的最后一列將轉換為 4 字節的整數(長整型)。 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 將退出,并將消息 ID 返回給客戶端。 例如:
復制
RAISERROR(50001, 10, 127)
此錯誤將導致 osql 腳本終止,并向客戶端返回消息 ID 50001。
返回值 1 - 99 是為 SQL Server 保留的;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,說明該值是原樣按完整的小數位存儲的。