T-SQL Enhancement in SQL Server 2005[上篇]
较之前一版本,SQL Server 2005可以说是作出了根本性的革新。对于一般的编程人员来说,最具吸引力的一大特性就是实现了对CLR的寄宿,使我们可以使用任意一种.NET Programming Language来编写Stored Procedure、Function、Trigger、User Defined Type等等。但是并不意味着我们使用多年的T-SQL即将被淘汰,而事实上T-SQL仍然是我们最为常见的基于Database的编程语言。为了使编程人员更容易地使用T-SQL来实现一些较为复杂的功能,SQL Server 2005在T-SQL进行了一系列的改进,这篇文章将概括性地介绍这些T-SQL Enhancement。 为了使读者对这些新引入的T-SQL特性有一个大概的了解,我先概括性地列出这些特性:
一、APPLY OperatorAPPLY这个操作符被置于一个查询的FROM语句中,对于查询出的每条数据行,都去调用一个Table Value Function(TVF),并将TVF的数据附加在现有的查询结果上。APPLY通常用于这样的场景中:查询的结果一部分包含在一个Table或者View中,另一部分则通过一个TVF来获得,通过TVF获得的记录是基于Table或者View中每条记录的某个Column的数据,也就是说我们把Table或者View的某个Column的值作为调用TVF的参数。这实际上将通过TVF获得的Table作为现有Table或者View的Outer table,将它们连接(Join)在一起,而连接它们的Key就是作为TVF参数传入的Column。 我们知道Join分为Inner Join和Outer Join,他们分别对应着CROSS APPLY和OUTER APPLY。如果对于某个条记录,TVF发挥的是一个空的Rowset,对于CROSS APPLY,该记录将不会出现在最终的结果中,而对于OUTER APPLY来说,最终的查询结果将包含该条记录,只是基于TVF的Column的值为NULL。 可能文字描述太过抽象,我们现在通过例子来进一步理解APPLY Operator。下面的例子基于的Database是SQL Server 2005 的Sample Database:AdventureWorks。(注:后续的例子如未作特殊的说明,均使用的是该Database)。我们首先创建一个TVF:dbo.fn_getproduct。根据Product ID获得产品信息。 1: IF EXISTS (SELECT * FROM sysobjects WHERE type = 'IF' AND name = 'fn_getproduct') 3: DROP Function dbo.fn_getproduct 5: GO
7: CREATE Function dbo.fn_getproduct 9: @product_id Int
11: RETURNS TABLE 13: AS RETURN 15: FROM Production.Product WHERE ProductID = @product_id 17: GO 然后我们做如下的查询:对Production.WorkOrder作查询,并列出对应的Product的信息: 2: FROM Production.WorkOrder WorkOrder
WHERE ProductID = @product_id * -1 OUTER APPLY dbo.fn_getproduct(WorkOrder.ProductID) 下面是最终的输出结果,我们发现所有的Order记录被返回,通过TVF获得的ProductNumber和Name的值为NULL。这充分说明了OUTER APPLY采用的是OUTER JOIN。
二、Common Table ExpressionCommon Table Expression(CTE)可以看成是一个临时创建的View,他的生命周期仅仅限于当前Context。一旦CTE被创建,你可以将它当成一般的Table,大部分基于Table的操作都可以运用于CTE。下面是创建CTE的语法结构: AS
4: query AS |
- 在ASP.NET,VS2008中“无法重新格式化文档”
- asp.net – 如何以编程方式将SMTP服务器详细信息存储(保存)
- asp.net – 在IIS 7.5上使用传出异步Web请求时的可扩展性问
- asp.net C#Operation可能会破坏运行时的稳定性
- asp.net – 如果禁用ViewState会发生什么
- asp.net-web-api – 如何配置Web API 2和结构图
- ASP.NET Ajax客户端框架无法加载.将ScriptManager放在空白页
- 从数据到代码——通过代码生成机制实现强类型编程[下篇]
- asp.net-core – 如何使用TeamCity使用WebDeploy部署ASP.NE
- ASP.NET MVC – jquery datepicker