SQL 2005中有個CTE (Common Table Expression)功能十分強大,可以用來做遞迴式的參考,藉以達成複雜的查詢邏輯並簡化查詢指令,是 SQL2005的一個新的重要功能。在使用 MySQL 時,由於沒有查詢端的存取模型好用,所以分頁通常都由程式自己來,在查詢指令下 limit m,n後,即可將要指定的分頁資料傳回,不會浪費 Network IO 在傳遞資料上。在 SQL Server 2000之前要達成這樣的功能,通常是配合temp table並配合 identity 欄位達成,但是仍需要將所有資料從第一筆到第 n 筆寫入 temp table 後,再取 top 的方式來操作,效能仍舊不理想。
所以我們可以使用SQL Server 2005中的CTE (Common Table Expression) 搭配 行號函數 ROW_NUMBER()來達到目的。與 ADO.NET 的分頁做比較,不僅可以降低 Network IO 外,更能在複雜查詢時提升效能,減少不必要的資源浪費,對於網頁分頁使用時有很大的幫助。
例如:查詢訂單資料表(orders),依訂單金額由大而小排序,取出第301到第400筆資料:
範例程式碼如下:
標籤: SQL Server T-SQL
許多專案主導者都會要求程式設計師不要在程式中組裝 SQL 語句,而改用 Stored Procedure,並使用 Parameter 來傳遞參數。但是這樣就真的能夠對 SQL Injection 完全免疫了嗎? 其實不然,SQL Injection 是由組裝式 SQL 語句而引發的,得注意有任何有【組裝式 SQL】發生的程式碼,當然也包含了 Stored Procedure。
假設今天我們有一個需求,是需要組合多個條件的查詢,我們應該在預存程序裡面再使用一次傳遞參數方式,來避免有任何的組裝式 SQL 的程式碼。
標籤: SQL Server T-SQL
SQL Server 2000 的 SQL Mail 提供從 Microsoft SQL Server 傳送和讀取電子郵件的簡易方式,但是 SQL Mail 屬於 MAPI 應用程式,所以伺服器上必須出現 MAPI 子系統。如果要使用 SQL Mail,就必須安裝 MAPI 用戶端,例如 :Microsoft Outlook 或是 Exchange Server。本文件所提及之技術,伺服器可以不必安裝MAPI 子系統,即可發送電子郵件。
我們可以利用 SQL Server OLE Automation 系統預存程序,來呼叫 CDOSYS 物件模型,並搭配任何支援 SMTP 郵件的郵件伺服器,作為自己的遠端 SMTP 郵件伺服器,來達到寄送電子郵件的功能。
標籤: SQL Server T-SQL
假設現在我們有4個需求分別是:
1. 新增訂單之後,將庫存量減去訂單的訂購產品數量。
2. 修改產品單價的時後,不得超過原始價值的10%。
3. 如果訂單被刪除了,系統可以寄Mail通知管理人員。
4. 新增訂單時,訂單流水號能夠依照日期所產生,例如:200803270123。
我們要如何建立觸發程序,並達到我們的需求 ?
觸發程序簡易說明:
Trigger Definition:
1. 觸發程序是依附資料表或檢視存在,本身是整個交易的延伸。
2. 從應用程式進行資料處理異動作業開始到觸發程序執行完畢,都屬於同一個交易的範圍。
DML Trigger:
(1) After Trigger:在執行Insert、Update、Delete陳述式的動作之後執行。
(2) Instead of Trigger:取代原先的Insert、Update、Delete的動作。
我們先建立兩個測試用的資料表,並依照需求順序建立對應的觸發程序。
標籤: SQL Server T-SQL