返回“ASP.NET 2.0數據教程目錄”
導言:
Microsoft SQL Server裡有一種computed columns列.這種列的 值是通過一個表達式來計算,而表達式引用的是同一張表的其它列的值.打個比方 ,有一張ServiceLog表,其包含了ServicePerformed, EmployeeID, Rate, Duration等列. 雖然我們可以在一個web頁面或其它什麼界面裡計算每筆服務的費 用(也就是 比率 rate乘以時間段duration),不過我們也可以手動向ServiceLog 表添加一個 AmountDue列以反映該信息.我們可以將該列創建為一個普通列,只是 任何時候當Rate 或 Duration列的值發生改變時需要更新AmountDue列的值.一個 比較好的辦法是將AmountDue創建成一個computed column 列,其使用的表達式為 Rate * Duration. 這樣,當在一個查詢裡引用該列時SQL Server就可以自動的計 算AmountDue列的值.
由於computed column列的值是由表達式決定的,所 以這種列是只讀的,並且不能在INSERT 或 UPDATE statements裡對其賦值.然而 ,對使用ad-hoc SQL statements的TableAdapter來說,如果主查詢裡引用了 computed column列,那麼自動生成的INSERT 和 UPDATE statements也會自動的 引用computed column列.所以,我們必須更新TableAdapter的 INSERT 和 UPDATE 查詢,以及InsertCommand 和 UpdateCommand屬性,以刪除對任何computed column列的引用.
如果在使用 ad-hoc SQL statements的TableAdapter裡 使用computed columns的話,我們要面臨的挑戰之一便是,每當完成TableAdapte 設置向導時,TableAdapter的 INSERT 和 UPDATE查詢都會自動的生成,又再一次 的自動引用computed column列.不過如果TableAdapters使用存儲過程的話,就不 會出現這個問題.
在本文,我們將向Northwind數據庫的Suppliers表添加 一個computed column列,然後相應地創建一個TableAdapter來處理該表以及該 computed column列.我們將在TableAdapter裡使用存儲過程而不是ad-hoc SQL statements.
第一步:向Suppliers表添加一個Computed Column
在 本文,我們將向Suppliers表添加一個名為FullContactName的computed column列 ,它以“ContactName (ContactTitle, CompanyName)”的格式返回 contact的name, title,以及所在的公司.
打開服務器資源管理器,在 Suppliers表上單擊右鍵,選“Open Table Definition”,這將會顯 示出表所包含的列以及列的屬性,比如數據類型、是否允許為NULL值等等.要添加 一個computed column列,只需在表定義裡鍵入表的名稱,接下來在Column屬性窗 口的Computed Column Specification部分的(Formula)文本框裡輸入表達式(如 圖1所示)。將該computed column列命名為FullContactName,並使用下面的表達 式:
ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
ContactTitle + ', ' ELSE '' END + CompanyName + ')'
請注意,在SQL裡可以用操作符 “+” 來連接字符串。而CASE聲明類似於傳統編程語言裡的條件語句 。上面代碼裡的CASE 聲明可以這樣來理解:如果ContactTitle 不為NULL,那麼 輸出ContactTitle值,再緊接一個逗號;如果為NULL,則無操作。關於CASE 聲明 的更多信息請參閱文章《The Power of SQL CASE Statements》 (http://www.4guysfromrolla.com/webtech/102704-1.shtml)
注意:除 了CASE聲明外,我們還可以使用ISNULL(ContactTitle, '')。語法 ISNULL(checkExpression, replacementValue) returns是這樣工作的,如果 checkExpression 不為NULL,則對其進行返回;如果為NULL則返回 replacementValue.雖然本文這2種語法都可以使用,但是在一些稍微復雜點的情 況下,使用ISNULL的情況要多一些.添加完computed column列後,你的屏幕看起 來應該和圖1差不多:
圖1:向Suppliers表添加一個名為FullContactName的Computed Column 列
添加完後點工具欄上的Save圖標,或按Ctrl+S鍵,又或者在File菜單裡 選“保存Suppliers”.“保存”操作會自動地刷新服務器 資源管理器,將剛剛添加的的列展現在Suppliers表裡.此外,鍵入到(Formula)文 本框的表達式會自動的進行調整,剔除不必要的空白,將列名用[]括起來,並使 用圓括號()來顯示操作的先後順序:
(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
then [ContactTitle]+', ' else '' end)+[CompanyName])+') ')
關於Microsoft SQL Server裡computed columns列的更多 信息請參考文章《technical documentation》 (http://msdn2.microsoft.com/en-us/library/ms191250.aspx);同時你也可 以參考文章《How to: Specify Computed Columns》 (http://msdn2.microsoft.com/en-us/library/ms188300.aspx),看如何一步 步地創建computed columns列.
注意:默認情況下,數據庫表並沒有 “實際”(physically)的包含computed columns列,而是每次在一個 查詢裡引用它時重新計算其值.不過,我們可以選擇“Is Persisted” 選項來讓SQL Server實實在在的在數據庫表裡創建computed columns列.這樣的話 我們可以為computed column列創建一個索引,當在一個查詢的WHERE字句裡使用 computed column列的值時就可以提高執行效率.更多的信息請參閱文章 《Creating Indexes on Computed Columns》(http://msdn2.microsoft.com/en -us/library/ms189292.aspx)