在本文的前一部分,我们说UDF会返回数值或者数据表。现在让我们进一步了解下如何创建和执行返回数值和表的UDF。
SQL SERVER 2000中增加了生成UDF的CREATE FUNCTION。UDF由若干部分组成,如清单A所示。
Transact-SQL(T-SQL)逻辑需要ownerprefix组件来避免不明确的索引。许多开发人员都建议包含这一前缀,甚至在T-SQL不需要的情况下也最好这样做。你可以传递参数—parameter1、parameter2等等,但实际上它们都不是必要的。表A就列出了CREATE
FUNCTION可用的参数定义。
表A
参数 |
说明 |
ownerprefix |
标识函数属主。 |
functionname |
标识UDF名称,在数据库范围内必须对属主唯一。 |
@parameterx |
该参数把值传递给UDF,它是可选的。函数最多可以拥有1024个参数,除非定义了默认值(请参看本表内的defaultvalue),否则在调用UDF的时候必须向其传值。由于参数名称对UDF而言只具有局部性质,所以同样的参数名还可以被其他函数所采用。 |
datatype |
声明参数的数据类型。 |
defaultvalue |
设置参数的默认值。使用DEFAULT关键词的语法如下: SELECT * FROM ownerprefix.functionname(DEFAULT) 这里的DEFAULT关键词正处于恰当的参数位置。省略DEFAULT关键词在没有传值的情况下会令函数返回一个错误。 |
|
定义UDF为数值函数;scalardatatype设置传值的数据类型。scalardatatype必须是一个有效的数值数据类型。 |
|
该选项定义了SELECT 语句中的表变量结果。 |
|
设置表变量,由@returnvariable参数(作为名字)指定,在返回表变量时tabledefinition定义表数据类型。允许的约束是PRIMARY KEY、UNIQUE、NULL和CHECK。 |
|
有两个可选项:WITH SCHEMABINDING和WITH ENCRYPTION。下面我们会更为详细地讨论WITH SCHEMABINDING 。WITH ENCRYPTION的使用必须小心,最好保存好你原来的代码因为你一旦对代码加密之后就不能读代码了。事实上,除非你确实有一个足够的安全理由采用WITH ENCRYPTION否则最好不要使用它! |
CREATE FUNCTION参数
所谓Schema binding其实就是把对象(在这种情况下指的是函数)和表绑定起来。Schema binding保证所处理的表不会被修改从而不会对UDF造成破坏。采用ALTER或者DROP修改绑定表是不能允许的,除非你首先删除了绑定函数。此外,在执行绑定函数期间添加到表里的任何列都只能在新列存储到表内之后才会以星号(*)的形式返回,同样的,你也不能删除绑定函数索引的列。
在设置UDF schema binding之前必须遵守以下条件:
以前我们提到UDF会返回数值或者数据表变量。所谓的数值函数返回单一值。语法很简单,如清单B所示。
清单C 的例子演示了一个简单的数值UDF。该函数接受两个参数,通过一个几何公式计算这些值并返回代表面积的十进制数值。记住其中得包括ownerprefix标记,在这个例子下就是dbo(默认的数据库属主)。Functionname则可以按你的需要设置,我们在这里把这个例子叫做dbo.Are,这个名字可以简单说明UDF的任务。
为了调用dbo.Area只需要在SELECT语句中包含函数名和所需要的参数即可,语法如下所示:
SELECT dbo.Area(l,w)
这里 l代表长度值,w代表宽度值。比方说,假如你给函数传递参数值为12和10,那么dbo.Area会返回值120,如图A所示。
dbo.Area UDF接受了两个参数值,用一个简单表达式对这两个值进行计算然后返回结果