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