程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0數據教程之七十一:處理Computed Columns列

ASP.NET 2.0數據教程之七十一:處理Computed Columns列

編輯:關於ASP.NET

返回“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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved