在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:
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。