ASP.NET 2.0数据教程之七十一:处理Computed Columns列2010-08-13 翻译:CSDN 王文涛返回“”导言: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 THENContactTitle + ", " 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)