网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  如何在SQL Server中构建并利用UDF表格     
  文章作者:未知  文章来源:未知  
  查看:202次  录入:管理员--2007-07-07  
 

在SQL Server 2000和2005中,UDF(用户定义函数)表格是我最喜欢的特性之一。如果你还没有用过它们,可以试一下,它会带给你很多惊喜的。

UDF表格和返回一个记录集的存储过程类似。你可以通过如下简单的示例代码,得到一个两列无行或数行的记录集。

CREATE PROCEDURE simple_ap
( @cityID integer )
AS
SELECT CustomerID, CompanyName
FROM Customers
WHERE Customers.CityID = @cityID

要重复利用这样一个存储过程的结果没有简单的方法。例如,你不能将记录集应用于其他的程序,或者将其添加到一个表格、视图或另一个记录集中。如果可以做到这一点的话,那么你重复利用代码的机会就会大大增加,并且,你还可以据此自己设计代码。

进入UDF表格,这种构造使你能够像处理一个真正的表格或视图那样对待结果集——你可以将它加入到其他的对象中,对它添加一个WHERE字句,甚至更多。

以下的代码中包括了在SQL Server 2000中创建UDF表格的句法:

CREATE FUNCTION [owner].[function_name]
(
@parm1 <datatpe> = <default>
)
RETURNS TABLE
AS
RETURN
(
SELECT <column1, column2, ...>
FROM <table, view, etc.>
WHERE <some condition applies>      -- optional clauses
)

要将以上的存储过程转换成为一个UDF表格,只需用适当的块替换UDF句法中的位置标记就行了,就像下面这样:

CREATE FUNCTION [dbo].[Customers_By_City_Select]    
-- denotes table UDF
(
@city nvarchar(15)
)
RETURNS TABLE
AS
RETURN
(
SELECT CustomerID, CompanyName
FROM dbo.Customers
WHERE Customers.City = @city
)

结果集是相同的,但是它却有一些很好的新优点。首先,利用过程的话,调用方法如下:EXEC simple_ap 12345 而对UDF的调用是这样的:

SELECT * FROM Customers_By_City_Select ('Berlin')

我们注意到,如果利用UDF的话,我们可以向调用添加DISTINCT命令,用它来减少该示例代码中的结果集:

ALFKIAlfredsFutterkiste
ANATRAna Trujillo Emparedados y helados
ANTONAntonio Moreno Taquería
AROUTAround the Horn

这不仅证明一个表格函数就是一个真实的表格,而且也表明允许这种灵活性的过程将肯定会更加复杂。

乐趣才刚刚开始。我们可以选中函数所返回的列中的任一子集:

SELECT CustomerID FROM Customers_By_City_Select ('Berlin')

表格函数最好的一个方面就是它们的表格性:在将其添加到表格、查看和其他表格函数中时,要引用UDF,把它当作表格来处理:

SELECT Customers_By_City_Select.CustomerID, OrderID  
FROM Customers_By_City_Select ('Berlin')
INNER JOIN Orders ON Orders.CustomerID = Customers_By_City_Select.CustomerID

返回以下结果集:

ALFKI10643
ALFKI10692
ALFKI10702
ALFKI10835
ALFKI10952
ALFKI11011

这种能力使得我喜欢称之为的原子查询变得更简易。原子查询从表格(或视图)中返回结果。通过结合几个原子查询,你可以创建一个(包括几个原子查询的)分子查询。UDF表格使你能够达到一个存储过程不可能完成的高细粒性和重复利用性水平。

 
 
上一篇: 迅速安装Linux与Oracle数据库步骤精讲    下一篇: 使用T-SQL操作面试SQL Server开发人员
  相关文档
oracle数据库10g环境下修改vip地址的方法 07-25
影响oracle数据库系统性能的初始化参数 11-19
查看本用户下的各种对象的SQL脚本 01-15
解析:oracle中 限制返回 结果集的大小 11-20
Oracle专家调优秘密 01-15
细化解析:怎样恢复一个丢失的 数据文件 11-15
关于Oracle的虚拟专有数据库特性探讨 04-11
在Windows系统下完全卸载Oracle的好方法 09-29
深刻理解Oracle数据库的启动和关闭 01-15
where子句在编写过程中需要注意的问题 (1) 03-28
oralce数据库定时执行存储过程的设置步骤 01-31
详细讲解Oracle中DECODE()函数的使用法 05-27
Oracle数据库中有关CBO优化的三个问题 09-01
讲解v$datafile_header相关字段的使用 03-10
Oracle数据库物理文件空间设置方法 04-12
通过db查询的两个数据库间scn会被同步 03-26
_row_cache_cursors参数应当如何设置 04-16
如何让oracle数据库始终保持优良性能 04-29
exp的版本高于数据库版本导出时出现报错 03-03
sql语句格式化数字(前面补0)的参考示例 07-01
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息