用批處理文件執行SQL腳本


需求:執行bat批處理文件能夠自動執行某些已經寫好的sql 腳本。

步驟:(1) 創建一個批處理文件:打開記事本,創建數據庫連接信息(例如,server name,username,password,databasename等)以及要執行的*.sql腳本名稱。具體語法參考下        文"osql 實用工具" 。 將文件的擴展名改為.bat 並保存。

      示例1: 指定待執行sql 文件的相對路徑  

osql -S admin\admin -U sa -P sa -d TestDB -i c:\test.sql
pause

   示例2:  待執行文件與bat文件在同一個目錄,指定相對路徑

       set localdir=%~dp0
           osql -S (local) -U sa -P sa -d Test -i %localdir%\test1.sql
       osql -S (local) -U sa -P sa -d Test -i %localdir%\test2.sql 
         osql -S (local) -U sa -P sa -d Test -i %localdir%\test3.sql
           pause

  (2) 創建需要執行的sql 腳本, test.sql,test2.sql 和test3.sql, 並放在步驟(1)示例1中指定的位置。本例為c:\ 根目錄。如果用示例2,將待執行的sql和bat文件放在同一個目錄下。

  (3) 雙擊*.bat 文件並查看運行結果。

 

[osql 實用工具]
osql 實用工具使您得以輸入 Transact
-SQL 語句、系統過程和腳本文件。該實用工具通過 ODBC 與服務器通訊。 

語法 

osql
[-?] |
[-L] |
[
{
{-U login_id [-P password]}
| –E
}
[-S server_name[\instance_name]] [-H wksta_name] [-d db_name]
[-l time_out] [-t time_out] [-h headers]
[-s col_separator] [-w column_width] [-a packet_size]
[-e] [-I] [-D data_source_name]
[-c cmd_end] [-q "query"] [-Q "query"]
[-n] [-m error_level] [-r {0 | 1}]
[-i input_file] [-o output_file] [-p]
[-b] [-u] [-R] [-O] [-X[1]]
]

參數-

顯示 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  

-

使用信任連接而不請求密碼。 

-S server_name[instance_name] 

指定要連接的 Microsoft® SQL Server™ 
2000 實例。在該服務器上指定 server_name 以連接到 SQL Server 的默認實例。在該服務器上指定 server_nameinstance_name 以連接到一個已命名的 SQL Server 2000 的實例。如果未指定服務器,osql 將連接到本地計算機上的 SQL Server 默認實例。從網絡上的遠程計算機執行 osql 時,此選項是必需的。 

-H wksta_name 

是工作站名稱。工作站名稱存儲在 sysprocesses.hostname 中並由 sp_who 顯示。如果未指定此選項,則采用當前計算機名稱。 

-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 默認為服務器的默認值。 

-

回顯輸入。 

-

設置 QUOTED_IDENTIFIER 連接選項為開啟。 

-D data_source_name 

連接到用 Microsoft SQL Server 的 ODBC 驅動程序定義的 ODBC 數據源。osql 連接使用該數據源中指定的選項。 


說明  該選項不適用於其它驅動程序定義的數據源。 


-c cmd_end 

指定命令終止符。默認情況下,通過單獨在一行中輸入 
GO 來終止命令並將其發送到 SQL Server 2000。在重置命令終止符時,不要使用對操作系統有特殊含義的 Transact-SQL 保留字或字符,無論其前面是否有反斜杠。 

-q "query" 

啟動 osql 時執行查詢,但是在查詢完成時不退出 osql。(注意查詢語句不應包含 
GO)。如果從批處理文件中發出查詢,請使用 %variables 或環境 %variables%。例如: 

SET table = sysobjects 
osql 
/q "Select * from %table%

將查詢用雙引號引起來,將查詢中嵌入的任何內容用單引號引起來。 

-Q "query" 

執行查詢並立即退出 osql。將查詢用雙引號引起來,將查詢中嵌入的任何內容用單引號引起來。 

-

從輸入行中刪除編號和提示符號 (
>)。 

-m error_level 

自定義錯誤信息的顯示。顯示指定的或更高嚴重級別錯誤的消息數、狀態和錯誤級別。不顯示嚴重級別低於指定級別的錯誤的任何信息。用 
-1 指定與消息一起返回所有標題,即使是信息類的消息。如果用 –1,則在參數和設置之間不能有空格(可以是 -m-1,不能是 --1)。 

-r {0  ¦ 1

將消息輸出重定向到屏幕 (stderr)。如果未指定參數,或指定參數為 
0,則僅重定向嚴重級別為 17 或更高的錯誤信息。如果指定參數為 1,則將重定向所有消息輸出(包括 "print")。 

-i input_file 

標識包含一批 SQL 語句或存儲過程的文件。小於 ( 
<) 比較運算符可以用來代替 –i。 

-o output_file 

標識從 osql 接收輸出的文件。大於 (
>) 比較運算符可以用來代替 –o。 

如果 input_file 不是 
Unicode 並且沒有指定 -u,則 output_file 將存儲為 OEM 格式。如果 input_file 是 Unicode 或者指定了 -u,則 output_file 將存儲為 Unicode 格式。 

-

打印性能統計。 

-

指定發生錯誤時 osql 退出並返回一個 DOS ERRORLEVEL 值。當 SQL Server 錯誤信息的嚴重級別為 
10 或更高時,返回給 DOS ERRORLEVEL 變量的值為 1;否則返回 0。Microsoft MS-DOS® 批處理文件可以測試 DOS ERRORLEVEL 的值並適當處理錯誤。 

-

指定 output_file 存儲為 
Unicode 格式,而不管 input_file 為何種格式。 

-

指定在將貨幣、日期和時間數據轉換為字符數據時 SQL Server ODBC 驅動程序使用客戶端設置。 

-

為與 isql 的早期版本行為匹配,指定停用某些 osql 功能。下列功能停用:  

EOF 批處理 


控制台寬度自動調整 


寬信息  
同時還將 DOS ERRORLEVEL 的默認值設置為 –
1。 

注釋 
osql 實用工具從操作系統直接啟動,並且使用本文中列出的區分大小寫的選項。啟動后,osql 接受 SQL 語句並將它們交互地發送到 SQL Server。結果被格式化並顯示在屏幕上 (stdout)。可使用 QUIT 或 
EXIT 退出 osql。 

如果啟動 osql 時未指定用戶名,SQL Server 
2000 將檢查環境變量並使用它們,例如 osqluser=(user) 或 osqlserver=(server)。如果未設置環境變量,則使用工作站用戶名。如果未指定服務器,則使用工作站名稱。 

如果 
-U 或 -P 選項都沒有使用,則 SQL Server 2000 將嘗試使用 Windows 身份驗證模式進行連接。身份驗證基於運行 osql 的 Microsoft Windows NT® 用戶帳戶。 

osql 實用工具使用 ODBC API。該實用工具使用 SQL Server 
2000 SQL-92 連接選項的 SQL Server ODBC 驅動程序默認設置。有關更多信息,請參見 SQL-92 選項的效果。 

有關此實用工具位置和運行方式的信息,請參見命令提示實用工具入門。 

OSQL 命令 
除了 osql 中使用的 Transact
-SQL 語句外,下表中的命令也可用。 

命令 描述  
GO 執行最后一個 GO 命令之后輸入的所有語句。  
RESET 清除已輸入的所有語句。  
ED 調用編輯器。  
!! command 執行操作系統命令。  
QUIT 或 
EXIT( ) 退出 osql。  
CTRL
+C 鍵 不退出 osql 而結束查詢。  


僅當命令終止符 
GO(默認)、RESET、ED、!!、EXIT、QUIT 和 CTRL+C 出現在一行的開始(緊跟 osql 提示符)時才可以識別。osql 忽視同一行中這些關鍵字后輸入的任何內容。 

GO 表明一批的結束和任何已被高速緩存的 Transact-SQL 語句的執行。在每個輸入行的結尾按 ENTER 鍵時,osql 將高速緩存此行的語句。鍵入 GO 后按 ENTER 鍵時,所有當前已緩存的語句都將作為批處理發送到 SQL Server。 

當前的 osql 實用工具工作起來就好像在任何被執行的腳本結尾處都帶有隱含的 
GO,因而腳本中的所有語句都將執行。最后一個 GO 后的任何語句都不執行。 

通過鍵入以命令終止符作為開始的行來結束命令。可以在命令終止符后輸入一個整數來指定命令運行的次數。例如,若要執行此命令 100次,請鍵入: 

SELECT x = 1 
GO 100 

執行結束時打印一次結果。osql 不接受每行字符數超過 
1,000 的結果。長語句應當跨多個行書寫。 

通過在行首鍵入 ED,用戶可以在當前查詢緩沖區上調用編輯器。編輯器在 EDITOR 環境變量中定義。默認編輯器為"edit"。可以通過設置 EDITOR 環境變量來指定其它編輯器。例如,若要將默認編輯器指定為 Notepad,請在操作系統提示符處輸入: 

SET EDITOR=notepad 

操作系統命令 
通過用兩個驚嘆號 (!!) 開始一行,然后輸入命令的方式,也可以執行操作系統命令。Windows NT 的命令撤回功能可用來撤回和修改 osql 語句。鍵入 RESET 可以清除現有的查詢緩沖區。 

在運行存儲過程時,osql 在批處理中的每個結果集之間打印一個空行。此外,如果沒有應用於已執行的語句,則"
0 行受到影響"消息不會出現。 

交互性使用 osql 
若要交互性使用 osql,請在命令提示符處鍵入 osql 命令(以及任何選項)。 

可以通過鍵入類似下行的命令,在包含由 osql 執行的查詢的文件(例如 Stores.qry)中進行讀取: 

osql 
/U alma //i stores.qry 

該文件必須包含命令終止符。  

可以通過鍵入類似下行的命令,在包含查詢的文件(例如 Titles.qry)中進行讀取並將結果導向另一文件: 

osql 
/U alma //i titles.qry /o titles.res 

交互性使用 osql 時,為把操作系統文件讀入到命令緩沖區,可使用:r 
file_name。不要在文件中包含命令終止符;在完成編輯后交互輸入終止符。 

插入注釋 
在 osql 提交給 SQL Server 的 Transact
-SQL 語句中可以包含注釋。允許使用兩種注釋風格類型:-- 和 /*...*/。 

有關更多信息,請參見使用注釋。 

使用 
EXIT 返回 osql 結果 
可以使用 
SELECT 語句的結果作為 osql 的返回值。第一個結果行的第一列轉換為 4 字節的整數(長整型)。MS-DOS 將低字節傳遞給父進程或操作系統錯誤級別。Windows NT 則傳遞整個 4 字節整數。語法為: 

EXIT(query) 

例如: 

EXIT(SELECT @@ROWCOUNT

EXIT(SELECT 5

也可以包含 
EXIT 參數,使其作為批處理文件的一部分。例如: 

osql 
/Q "EXIT(SELECT COUNT(*FROM '%1')" 

osql 實用工具將圓括號 ( ) 中輸入的所有內容原樣傳遞給服務器。如果存儲系統過程選擇了一個集合並返回一個值,則僅返回選擇的內容。在圓括號之間無參數的 
EXIT( ) 語句執行批處理中此語句前的所有內容,然后退出,而不返回值。  

EXIT 格式有四種:  

EXIT  
不執行批處理就立即退出,無返回值。  

EXIT( )  
執行批處理后退出,無返回值。  

EXIT(query)  
執行包括查詢的批處理,返回查詢的結果后退出。  

狀態為 
127 的 RAISERROR。  
如果在 osql 腳本中使用 
RAISERROR,並且出現狀態 127,則 osql 會退出並將消息 ID 返回給客戶程序。例如:  

RAISERROR(5000110127

該錯誤會導致 osql 腳本終止並將消息 ID 
50001 返回給客戶程序。 

SQL Server 保留介於 
-1 到 -99 之間的返回值;osql 定義下列值:  

-100  
選擇返回值前遇到的錯誤。 

-101  
選擇返回值時找不到行。 

-102  
選擇返回值時發生轉換錯誤。 

顯示 
money 和 smallmoney 數據類型 
osql 只用兩位小數位數顯示 
money 和 smallmoney 數據類型,但 SQL Server 用四位小數位數在內部存儲這兩類數據的值。請看下例:  

SELECT CAST(CAST(10.3496 AS moneyAS decimal(64)) 

此語句的結果為 
10.3496,說明該值是原樣按完整的小數位存儲的。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM