在ASP.NET 2.0中操作数据之六十九:处理Computed Co

  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》(

  注意:除了CASE声明外,我们还可以使用ISNULL(ContactTitle, '')。语法ISNULL(checkExpression, replacementValue) returns是这样工作的,如果checkExpression 不为NULL,则对其进行返回;如果为NULL则返回replacementValue.虽然本文这2种语法都可以使用,但是在一些稍微复杂点的情况下,使用ISNULL的情况要多一些.添加完computed column列后,你的屏幕看起来应该和图1差不多:

/uploads/allimg/200612/1HAbA8_0.png


图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》();同时你也可以参考文章《How to: Specify Computed Columns》(),看如何一步步地创建computed columns列.

  注意:默认情况下,数据库表并没有“实际”(physically)的包含computed columns列,而是每次在一个查询里引用它时重新计算其值.不过,我们可以选择“Is Persisted”选项来让SQL Server实实在在的在数据库表里创建computed columns列.这样的话我们可以为computed column列创建一个索引,当在一个查询的WHERE字句里使用computed column列的值时就可以提高执行效率.更多的信息请参阅文章《Creating Indexes on Computed Columns》()

第二步:查看Computed Column列的值

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwywf.html