使用sqlcmd在批處理指令碼中執行SQL

2021-06-04 01:49:08 字數 1540 閱讀 6284

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

| –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 $=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執行的結果寫入到變數裡了。

使用SQLCMD在SQLServer執行多個指令碼

作為dba,經常要用開發人員提供的sql指令碼來更新正式資料庫,但是乙個比較合理的開發流程,當提交指令碼給dba執行的時候,可能已經有幾百個sql檔案,並且有執行順序,如我現在工作的公司,十幾個客戶,每個客戶乙個庫,但是資料庫結構 儲存過程 檢視等都是一模一樣,每次執行指令碼 以下稱為公升級 如果有...

使用SQLCMD在SQLServer執行多個指令碼

作為dba,經常要用開發人員提供的sql指令碼來更新正式資料庫,但是乙個比較合理的開發流程,當提交指令碼給dba執行的時候,可能已經有幾百個sql檔案,並且有執行順序,如我現在工作的公司,十幾個客戶,每個客戶乙個庫,但是資料庫結構 儲存過程 檢視等都是一模一樣,每次執行指令碼 以下稱為公升級 如果有...

使用 FTP 批處理指令碼 MS

ftp 檔案傳輸協議 是通常與 unix 系統一起使用的檔案傳輸實用工具。ftp 能夠使用指令碼 來自外部檔案的命令列表 下面的示例演示了乙個指令碼,該指令碼開啟與 ip 位址 11.11.11.11 的連線,以 guest 身份使用密碼 guest 登入到主機,上載 file1 檔案,然後退出 o...