使用 osql 實(shí)用工具,可以輸入 Transact-SQL 語句、系統(tǒng)過程和腳本文件。 此實(shí)用工具通過 ODBC 與服務(wù)器通信。
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] ]
參數(shù)
-?
顯示 osql 開關(guān)的語法摘要。
-L
列出在本地配置的服務(wù)器和在網(wǎng)絡(luò)上廣播的服務(wù)器的名稱。
注意
鑒于網(wǎng)絡(luò)上廣播的特點(diǎn),osql 可能不會及時接收來自所有服務(wù)器的響應(yīng)。 因此,每次調(diào)用該選項(xiàng)所返回的服務(wù)器列表都可能不同。
-U login_id
用戶登錄 ID。 登錄 ID 區(qū)分大小寫。
-P password
用戶指定的密碼。 如果未使用 -P 選項(xiàng),osql 將提示輸入密碼。 如果在命令提示符的末尾使用 -P 選項(xiàng)而不提供密碼,osql 將使用默認(rèn)密碼 (NULL)。
安全說明
不要使用空密碼。 請使用強(qiáng)密碼。 有關(guān)詳細(xì)信息,請參閱強(qiáng)密碼。
密碼是區(qū)分大小寫的。
使用 OSQLPASSWORD 環(huán)境變量,可以為當(dāng)前會話設(shè)置默認(rèn)密碼。 因此,不需要通過硬編碼在批處理文件中設(shè)置密碼。
如果不使用 -P 選項(xiàng)指定密碼,osql 將首先檢查 OSQLPASSWORD 變量。 如果未設(shè)置任何值,則 osql 將使用默認(rèn)密碼 (NULL)。 以下示例將在命令提示符中設(shè)置 OSQLPASSWORD 變量,然后訪問 osql 實(shí)用工具:
復(fù)制
C:\>SET OSQLPASSWORD=abracadabra
C:\>osql
安全說明
若要屏蔽密碼,請不要同時指定 -P 和 -U 選項(xiàng)。 相反,應(yīng)在指定 osql 和 -U 選項(xiàng)和其他開關(guān)(不指定 -P)之后,按 Enter 鍵,此時 osql 將提示您輸入密碼。 這種方法可以確保輸入密碼時對其屏蔽。
-E
使用可信連接而不請求密碼。
-S server_name[ **\instance_name]
指定要連接到的 SQL Server 實(shí)例。 指定 server_name 將連接到該服務(wù)器上的 SQL Server 默認(rèn)實(shí)例。 指定 server_name\**instance_name 將連接到該服務(wù)器中的 SQL Server 的命名實(shí)例。 如果未指定服務(wù)器,osql 將連接到本地計(jì)算機(jī)上的 SQL Server 默認(rèn)實(shí)例。 從網(wǎng)絡(luò)上的遠(yuǎn)程計(jì)算機(jī)執(zhí)行 osql 時,此選項(xiàng)是必需的。
-H wksta_name
工作站的名稱。 工作站名稱存儲在 sysprocesses.hostname 中,并按 sp_who 顯示。 如果不指定此選項(xiàng),則采用當(dāng)前計(jì)算機(jī)名稱。
-d db_name
啟動 osql時發(fā)出一個 USE db_name 語句。
-l time_out
指定 osql 登錄超時之前的秒數(shù)。 登錄到 osql 的默認(rèn)超時時間為 8 秒。
-t time_out
指定命令超時之前的秒數(shù)。 如果未指定 time_out 值,則命令將不會超時。
-h headers
指定要在列標(biāo)題之間打印的行數(shù)。 默認(rèn)為每一組查詢結(jié)果打印一次標(biāo)題。 使用 -1 可指定不打印標(biāo)題。 如果使用 -1,則在參數(shù)和設(shè)置之間一定不能有空格(可以是 -h-1,不能是 -h -1)。
-s col_separator
指定列分隔符字符,默認(rèn)值為空格。 若要使用對操作系統(tǒng)有特殊含義的字符(例如 | ; & < >),請將該字符用雙引號 (") 括起來。
-w column_width
允許用戶設(shè)置屏幕輸出的寬度。 默認(rèn)為 80 個字符。 當(dāng)輸出行達(dá)到其最大屏幕寬度時,會拆分為多行。
-a packet_size
允許您請求不同大小的數(shù)據(jù)包。 packet_size 的有效值介于 512 和 65535 之間。 默認(rèn)值 osql 是服務(wù)器默認(rèn)值。 執(zhí)行較大的腳本時,各個 GO 命令之間的 SQL 語句的數(shù)量是龐大的,因此增大數(shù)據(jù)包可以提高性能。 Microsoft 的測試表明大容量復(fù)制操作的最快設(shè)置通常為 8192。 可以請求更大的數(shù)據(jù)包,但如果請求不能得到批準(zhǔn),則 osql 會將此值默認(rèn)為服務(wù)器的默認(rèn)值。
-e
回顯輸入。
-I
將 QUOTED_IDENTIFIER 連接選項(xiàng)設(shè)置為開啟。
-D data_source_name
連接到某個通過用于 SQL Server 的 ODBC 驅(qū)動程序定義的 ODBC 數(shù)據(jù)源。 osql 連接使用該數(shù)據(jù)源中指定的選項(xiàng)。
注意
此選項(xiàng)不適用于為其他驅(qū)動程序定義的數(shù)據(jù)源。
-c cmd_end
指定命令終止符。 默認(rèn)情況下,可以在行中輸入一個單獨(dú)的 GO 來終止命令,并將該命令發(fā)送到 SQL Server。 如果要重置命令終止符,請勿使用對操作系統(tǒng)有特殊含義的 Transact-SQL 保留字或字符,無論其前面是否有反斜杠。
-q " query "
啟動 osql 時執(zhí)行查詢,但在查詢完成時不退出 osql。 (注意查詢語句不應(yīng)包含 GO)。 如果從批處理文件中發(fā)出查詢,請使用 %variables 或環(huán)境 %variables%。 例如:
復(fù)制
SET table=sys.objects
osql -E -q "select name, object_id from %table%"
將查詢用雙引號括起來,將查詢中嵌入的任何內(nèi)容用單引號括起來。
-Q" query "
執(zhí)行查詢并立即退出 osql。 將查詢用雙引號括起來,將查詢中嵌入的任何內(nèi)容用單引號括起來。
-n
從輸入行中刪除編號和提示符號 (>)。
-m error_level
自定義錯誤消息的顯示。 顯示指定的或更高嚴(yán)重級別的錯誤的消息數(shù)、狀態(tài)和錯誤級別。 不顯示低于指定級別的錯誤的信息。 使用 -1 可以指定返回所有標(biāo)題及其消息,即使是信息型消息。 如果使用 -1,則在參數(shù)和設(shè)置之間不能有空格(可以是 -m-1,不能是 -m -1)。
-r { 0| 1}
將消息輸出重定向到屏幕 (stderr)。 如果不指定參數(shù),或指定參數(shù)為 0,則僅重定向嚴(yán)重級別為 11 或更高的錯誤信息。 如果指定參數(shù)為 1,則將重定向所有消息輸出(包括“print”)。
-i input_file
標(biāo)識包含一批 SQL 語句或存儲過程的文件。 小于 (<) 比較運(yùn)算符可以代替 -i 使用。
-o output_file
標(biāo)識從 osql 接收輸出的文件。 大于 (>) 比較運(yùn)算符可以代替 -o 使用。
如果 input_file 不是 Unicode 并且未指定 -u,則以 OEM 格式存儲 output_file。 如果 input_file 是 Unicode 或者指定了 -u,則以 Unicode 格式存儲 output_file。
-p
打印性能統(tǒng)計(jì)信息。
-b
指定發(fā)生錯誤時,osql 退出并返回一個 DOS ERRORLEVEL 值。 當(dāng) SQL Server 錯誤消息的嚴(yán)重級別為 11 或更大值時,返回給 DOS ERRORLEVE 變量的值為 1;否則返回的值為 0。 Microsoft MS-DOS 批處理文件可以測試 DOS ERRORLEVEL 的值并正確地處理錯誤。
-u
指定無論 input_file 為何種格式,output_file 都以 Unicode 格式進(jìn)行存儲。
-R
指定在將貨幣、日期和時間數(shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù)時,SQL Server ODBC 驅(qū)動程序使用客戶端設(shè)置。
-O
指定停用某些 osql 功能以便與 isql 的早期版本的行為匹配。 下列功能停用:
同時還將 DOS ERRORLEVEL 的默認(rèn)值設(shè)置為 -1。
EOF 批處理
自動調(diào)整控制臺寬度
寬消息
注意
osql 不再支持 -n、-O 和 -D 選項(xiàng)。
注釋
osql 實(shí)用工具從操作系統(tǒng)直接啟動,并且使用本文中列出的區(qū)分大小寫的選項(xiàng)。 osql啟動后將接受 SQL 語句,然后以交互方式將這些語句發(fā)送到 SQL Server。 結(jié)果被格式化并在屏幕 (stdout) 上顯示。 可使用 QUIT 或 EXIT 退出 osql。
如果啟動 osql 時不指定用戶名,則 SQL Server 將檢查并使用環(huán)境變量,如 osqluser=(user) 或 osqlserver=(server)。 如果未設(shè)置環(huán)境變量,則使用工作站用戶名。 如果未指定服務(wù)器,則使用工作站名稱。
如果 -U 和 -P 選項(xiàng)都沒有使用,則 SQL Server 將嘗試使用 Microsoft Windows 身份驗(yàn)證模式進(jìn)行連接。 身份驗(yàn)證根據(jù)運(yùn)行 osql 的用戶的 Microsoft Windows 帳戶進(jìn)行。
osql 實(shí)用工具使用 ODBC API。 對于 SQL Server ISO 連接選項(xiàng),該實(shí)用工具使用 SQL Server ODBC 驅(qū)動程序的默認(rèn)設(shè)置。 有關(guān)詳細(xì)信息,請參閱“ANSI 選項(xiàng)的效果”。
注意
osql 實(shí)用工具不支持 CLR 用戶定義數(shù)據(jù)類型。 若要處理這些數(shù)據(jù)類型,必須使用 sqlcmd 實(shí)用工具。 有關(guān)詳細(xì)信息,請參閱 sqlcmd 實(shí)用工具。
OSQL 命令
除了 osql 中的 Transact-SQL 語句外,還可以使用以下命令。
命令
說明
GO
執(zhí)行上一個 GO 命令之后輸入的所有語句。
RESET
清除已輸入的所有語句。
QUIT 或 EXIT( )
退出 osql。
Ctrl+C
結(jié)束查詢但不退出 osql。
注意
!! 和 ED 命令 不再受 osql 支持。
僅當(dāng)命令終止符 GO(默認(rèn))、RESET、EXIT、QUIT 和 Ctrl+C 出現(xiàn)在一行的開始(緊跟 osql 提示符)時,才會被識別。
GO 在批處理和執(zhí)行任何緩存 Transact-SQL 語句結(jié)尾時會發(fā)出信號。 在每個輸入行的結(jié)尾按 Enter 鍵時,osql 將緩存此行的語句。 鍵入 GO 后按 Enter 鍵時,所有當(dāng)前已緩存的語句都將作為批處理發(fā)送到 SQL Server。
使用當(dāng)前的 osql 實(shí)用工具時,好像在所執(zhí)行的腳本結(jié)尾處都帶有隱含的 GO,因而將執(zhí)行腳本中的所有語句。
鍵入以命令終止符開始的行可結(jié)束命令。 可以在命令終止符后輸入一個整數(shù)來指定命令運(yùn)行的次數(shù)。 例如,若要執(zhí)行此命令 100 次,可鍵入:
復(fù)制
SELECT x = 1
GO 100
命令執(zhí)行結(jié)束之后將打印結(jié)果。 osql 每行的字符數(shù)不得超過 1,000 個。 長語句應(yīng)當(dāng)跨多行書寫。
Windows 的命令撤回功能可用來撤回和修改 osql 語句。 鍵入 RESET 可以清除現(xiàn)有的查詢緩沖區(qū)。
運(yùn)行存儲過程時,osql 在批處理中的每個結(jié)果集之間打印一個空行。 此外,如果沒有應(yīng)用于執(zhí)行的語句,則不會出現(xiàn)“0 行受到影響”消息。
以交互方式使用 osql
若要以交互方式使用 osql,請?jiān)诿钐崾痉墟I入 osql 命令(以及任何選項(xiàng))。
通過鍵入類似下面的命令,可以讀入一個包含由 osql 執(zhí)行的查詢的文件(例如 Stores.qry):
復(fù)制
osql -E -i stores.qry
通過鍵入類似下面的命令,可以讀入包含查詢的文件(如 Titles.qry),并將結(jié)果導(dǎo)向其他文件:
復(fù)制
osql -E -i titles.qry -o titles.res
安全說明
如果可能,請使用 -E選項(xiàng)(可信連接)。
以交互方式使用 osql 時,若要將操作系統(tǒng)文件讀入命令緩沖區(qū),可使用 :r file_name。 這會將 file_name 中的 SQL 腳本作為一個批處理直接發(fā)送給服務(wù)器。
注意
使用 osql 時,如果批處理分隔符“GO”出現(xiàn)在 SQL 腳本文件中,則 SQL Server 會將其視為語法錯誤。
插入注釋
可以在 osql 提交給 SQL Server 的 Transact-SQL 語句中包含注釋。 允許使用兩種類型的注釋樣式:-- 和 /*...*/。
使用 EXIT 返回 osql 中的結(jié)果
可以使用 SELECT 語句的結(jié)果作為 osql 的返回值。 如果為數(shù)值,則最后一個結(jié)果行的最后一列將轉(zhuǎn)換為 4 字節(jié)的整數(shù)(長整型)。 MS-DOS 將低字節(jié)傳遞給父進(jìn)程或操作系統(tǒng)錯誤級別。 Windows 則傳遞整個 4 字節(jié)整數(shù)。 語法為:
復(fù)制
EXIT ( < query > )
例如:
復(fù)制
EXIT(SELECT @@ROWCOUNT)
還可以在批處理文件中包含 EXIT 參數(shù)。 例如:
復(fù)制
osql -E -Q "EXIT(SELECT COUNT(*) FROM '%1')"
osql 實(shí)用工具將在圓括號 ( ) 中輸入的所有內(nèi)容原樣傳遞給服務(wù)器。 如果存儲系統(tǒng)過程選擇了一個集合并返回一個值,則僅返回選擇的內(nèi)容。 圓括號中無參數(shù)的 EXIT**(** ) 語句將執(zhí)行批處理中此語句前的所有內(nèi)容,然后不返回值退出。
EXIT 格式有四種:
EXIT
注意
不執(zhí)行批處理,立即退出,不返回值。
EXIT**(** )
注意
執(zhí)行批處理后退出,不返回值。
EXIT**(query)**
注意
執(zhí)行包括查詢的批處理,返回查詢的結(jié)果后退出。
狀態(tài)為 127 的 RAISERROR。
注意
如果在 osql 腳本中使用 RAISERROR,并且出現(xiàn)狀態(tài) 127,則 osql 將退出,并將消息 ID 返回給客戶端。 例如:
復(fù)制
RAISERROR(50001, 10, 127)
此錯誤將導(dǎo)致 osql 腳本終止,并向客戶端返回消息 ID 50001。
返回值 1 - 99 是為 SQL Server 保留的;osql 可定義下列值:
-100
選擇返回值前遇到錯誤。
-101
選擇返回值時找不到行。
-102
選擇返回值時發(fā)生轉(zhuǎn)換錯誤。
顯示 Money 和 Smallmoney 數(shù)據(jù)類型
osql 只用兩位小數(shù)位數(shù)顯示 money 和 smallmoney 數(shù)據(jù)類型,但 SQL Server 用四位小數(shù)位數(shù)在內(nèi)部存儲值。 請看下例:
復(fù)制
SELECT CAST(CAST(10.3496 AS money) AS decimal(6, 4))
GO
此語句的結(jié)果為 10.3496,說明該值是原樣按完整的小數(shù)位存儲的。