sqlcmd與T-SQL指令碼

Microsoft最偉大的地方就是把「UI」發揚光大,讓人們不用面對死死的指令。但就像我在學習Linux時,X-Window一點也不想用,一點也不吸引我,我深深的被那些指令吸引一樣,grep的過濾、vim的編輯、sed/awk的整理、iptables的強大、Shell Script的自動化…處處都是指令。

在MS SQL Server中,我覺得也有一個必學的指令,那就是sqlcmd,sqlcmd讓我們不必透過SSMS工具,就能直接與MS SQL Server溝通,不論本機或遠端,對sqlcmd而言,一般的T-SQL執行根本不是問題

例如使用sqlcmd查詢資料:

在cmd.exe下輸入sqlcmd <Enter>


sqlcmd
1>


會出現 1>提示代表已經成功與本機SQL Server連線,在1>下輸入:


1>select * from northwind.dbo.customers
2>go
... (執行結果)
1>


go為批次觸發指令,當sqlcmd看到go指令,會立即執行go之前的T-SQL陳述式。然後你會發現又回到1>提示,因為之前的T-SQL已經被執行了,所以就回到1>。按quit,就可以離開sqlcmd。

透過sqlcmd來執行T-SQL指令碼檔案(即含T-SQL陳述式的檔案),只要配合「排定的工作(Task Scheduler)」,就能幫我們輕鬆進行「定時、定期、排程」的資料庫作業,而不用使用到SQL Server Agent(這裡的不用是指T-SQL能做到的事)。

我舉個簡單的Select例子,這個例子將配合「指令碼變數」來一起使用。


指令碼變數


  • 在「T-SQL指令碼檔案」檔案內,宣告變數的語法為:「 $(變數名稱) 」(好像jQuery,^_^)
  • 在sqlcmd指令使用「-v」指定變數值「-v 變數名稱="變數值" 變數名稱="變數值"…」(多個變數使用空白區隔)

先使用記事本寫個T-SQL指令碼:



use $(dbname)  -- 資料庫名稱
go
select top $(num) $(c1)  -- num取幾筆, c1欄位名稱
from $(t1) -- 資料表名稱
go


存檔為sql.txt,然後開啟本機的cmd.exe,執行以下sqlcmd指令(d:為disk,請自行更改路徑):


sqlcmd -i d:\sql.txt -v dbname="Northwind" num=10 c1=* t1=orders


「-i 為input T-SQL file」,即會出現「Northwind資料庫中從Orders而來前10筆,含所有欄位的資料」,再來一個


sqlcmd -i d:\sql.txt -v dbname="Northwind" num=5 c1=* t1=products


即會出現「Northwind資料庫中從Products而來前5筆,含所有欄位的資料」,當然你可以再加上where/order by/group by等處理。

你可以透過以上方式整理一些「T-SQL指令碼樣版」,然後在要使用或要測試時拿來使用,絕對比起你每次都要重新打Select ... From ... Where ...要來的輕鬆,久了你就會喜歡上sqlcmd,你會發現原來單純的指令一點也不單純,當然sqlcmd不單單只是這樣。

我覺得sqlcmd跟SSMS是一個互補關係,sqlcmd是一個能減輕T-SQL在重覆式語法重覆定期工作上的好幫手,SSMS則是MS SQL Server開發工具味道,SSMS就好像.NET Framework必須透過Visual Studio來開發一般,那種感覺。

常常看到有網友在論壇上發問,「如何「定時、定期、排程」執行一支ASP.NET網頁程式,來進行某項工作?」如果此ASP.NET網頁程式是進行資料庫上的工作,那你需要的正是sqlcmd (或SQL Server Agent),而不是ASP.NET。

ps.. 臨時忘記sqlcmd參數,如何快速查詢sqlcmd參數?因為是cmd的程式,所以直接輸入「sqlcmd /?」就可以了,雖然沒有Linux的man強大,但也算半個man,常用的看一下就知道了。

Reference:

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。