萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> 使用sqlcmd在批處理腳本中執行SQL

使用sqlcmd在批處理腳本中執行SQL

使用sqlcmd可以在批處理腳本中執行SQL。雖然這個命令的參數很多,但幸運的是,我們不需要全部理解,在這裡簡要介紹以下幾個:

{ -U login_id [ -P password ] } | –E trusted connection }] 如果指定了-E就不需要指定用戶名密碼,當然指定了用戶名密碼就不用-E了;

-S server_name [ \ instance_name ] 數據庫服務器,如果不在本機的話必須指定;

-d db_name 數據庫名字,必須的;

[ -i input_file ] [ -o output_file ] sql存在文件裡的話用-i,輸出到文件用-o;

[ -q "cmdline query" ] [ -Q "cmdline query" and exit ] 輸入是簡單的sql,不用文件,推薦用-Q,如果你執行完sqlcmd還需要執行別的動作的話;

[ -W remove trailing spaces ] 刪除多余的空格,結果會更緊湊。

當我們在真正的腳本中執行sql時,通常需要傳入和輸出變量。

傳入變量比較簡單,如下所示:

sqlcmd -d test -Q "select * from dbo.Investment where investor=$(x)" -v x='IBM' -W

這個語句從test數據庫的Investment表中選出investor等於x的所有行,注意到變量x被包含在${}中。

然後用-v定義了x的值,'IBM'。

-W確定輸出的結果不包含多余的空格。

x的值如果沒有在sqlcmd中設定,系統會試圖從別的地方去尋找,可能的地方包括,系統環境變量,用戶環境變量,以及用在sqlcmd之前用set設定的變量值。

如果你的數據裡確實包含${},那麼你並不希望進行變量的替換,使用-x選項可以禁止變量的替換。

有些時候,你還希望能獲得sql執行結果並保存到變量中。比如你們的日志系統每天都在產生日志文件,你要執行一個腳本來處理這些日志文件並存到數據庫中。在處理之前,你必須讀取數據庫以確定上次處理到那一天了。你期望這樣能解決你的問題:

sqlcmd -d test -Q "select ${x}=max(date) from dbo.logDates " -W

但這樣並不工作。因為sqlcmd並不提供輸出變量。

不過你可以這樣做:

sqlcmd -d test -Q "declare @x nvarchar(8);select @x=max(date) from dbo.logDates;print @x; " -W

這樣你就可以得到一個干干淨淨的數字,而不會包含列名和其他信息。

接著你將上述結果導入到一個文件裡:

sqlcmd -d test -Q "declare @x nvarchar(8);select @x=max(date) from dbo.logDates;print @x; " -W >1.txt

現在到了最關鍵的一步,將文件的內容寫入到變量裡:

set /P myvar=<1.txt

/p表明這個變量myvar的值需要用戶輸入;

<1.txt表明從1.txt中讀入而不是從其他地方讀入。

這樣,我們就巧妙的把sql執行的結果寫入到變量裡了。

關鍵詞:

copyright © 萬盛學電腦網 all rights reserved