我们今天主要向大家讲述的是对SQL Server 2000 UDF进行深度发掘的实际操作,即Microsoft SQL Server 2000数据库的新增特性—用户的User-Defined Function(UDF)自定义函数,并演示几个常用的实例。
UDF的功能类似SQL Server中内建的系统函数,如CONVERT、SUBstRING、 DATAADD、 GETDATA、ISNULL等
本文将介绍Microsoft SQL Server 2000的新增特性—用户自定义函数User-Defined Function(UDF),并演示几个常用的实例。
UDF的功能类似SQL Server中内建的系统函数,如CONVERT、SUBSTRING、 DATAADD、 GETDATA、ISNULL等等。一个UDF可以没有参数,或者带有一个或多个参数,函数运行后将会返回一个函数值。定义UDF的语法如下:
CREATE FUNCTION [ owner_name.] function_name ( { { @parameter_name scalar_parameter_data_type [,…n] ] ) RETURN scalar_return_data_type [WITH < function_option> [, … n]] [AS] BEGIN Function_body RETURN scalar_expression END
每个UDF可以带有0个到1024个参数,每个参数可以是除了timestamp、cursor、table 以外所有的数据类型;函数返回值的限制要更多一些,它不可以是text、ntext、image、timestamp、cursor和table。
函数体是UDF的主要部分,它有两个选项: ENCRYOTION和 SCHEMABINDING。
SCHEMABINDING是SQL Server 2000的新增功能,可以和视图一同使用。该选项不允许删除和修改被该函数引用的对象。这样可以防止无效的函数和视图对它们引用的对象进行结构上的修改。
大家会注意到函数体以Begin开始,End结束。这一点不同于创建存储过程、触发器和视图。当您忘了写上Begin/End时,系统会返回一个提示信息“Incorrect syntax near ‘RETURN’”。为什么不直接说少了Begin/End,这有点让人费解。
下面我用几个例子来说明UDF的应用。
Greatest and Least
为了区别于系统函数Max和Min,我给新函数命名为Greatest和Least,它们会从以参数形式输入的两个值中找出更大值和最小值。
Case语句是两个函数的核心:
CASE WHEN value1 > value2 THEN value1 ELSE value2 END
虽然函数很简单,但用途是很广的。
CREATE FUNCTION dbo.Greatest -- Return the maximum of two parameters (@Val1 SQL_VARIANT, @Val2 SQL_VARIANT) RETURNS SQL_VARIANT AS BEGIN RETURN (CASE WHEN @val1 > @val2 THEN @val1 ELSE @val2 END) END go CREATE FUNCTION dbo.Least -- Return the minimum of two parameters ( @val1 SQL_VARIANT, @val2 SQL_VARIANT ) RETURNS SQL_VARIANT AS BEGIN RETURN (CASE WHEN @val1 < @val2 THEN @val1 ELSE @val2 END) END Go
大小写转换函数
该函数有两个参数:@String和@Capitalize_What。
依据 @Capitalize_What的值,函数有不同的功能:
¨ @Capitalize_What = ‘string’“
函数将 @string的之一个非空字符转换成大写, 其余部分改为小写。
¨ @Capitalize_What = ‘sentence’
函数将 @string中的每一句的首个非空字符转换为大写,句子其余部分转换为小写。断句的依据是’.’、’!’、’ ’
¨ @Capitalize_What = ‘word’
函数将 @string中的每个词都转换成首字符大写,其余小写的形式。
CREATE FUNCTION dbo.Capitalize ( -- Capitalize the first character of every word, -- sentence, or the whole string. Put the rest to lowercase. @String VARCHAR (8000), @Capitalize_What VARCHAR (8) = ’string’ -- String: Capitalize the first letter of the string -- Sentence: Capitalize the first letter of every sentence. -- Delimiters: ./!/ -- Word: Capitalize the first letter of every word. -- Delimiters: any characters other than letters and digits. ) RETURNS VARCHAR(8000) AS BEGIN DECLARE @Position *** ALLINT, @Char CHAR(1), @First_Char CHAR (1), @Word_Start *** ALLINT SET @Capitalize_What = LOWER( @Capitalize_What ) SET @Word_Start = 0 IF @Capitalize_What IN (‘word’, ‘sentence’) BEGIN SET @Position = DATALENGTH( @String ) WHILE @Position >= 0 BEGIN SET @Char = CASE @Position WHEN 0 THEN ’.’ ELSE UPPER( SUBSTRING( @String, @Position, 1 ) ) END IF @Char BETWEEN ’A’ AND ’Z’ OR @Char BETWEEN ’0’ and ’9’ BEGIN SET @Word_Start = @Position SET @First_Char = UPPER( @Char ) END ELSE BEGIN IF @Capitalize_What = ’word’ OR @Char in ( ’.’, ’!’, ’ ’ ) BEGIN IF @Word_Start > 0 AND @First_Char BETWEEN ’A’ AND ’Z’ SET @String = STUFF( @String, @Word_Start, 1, @First_Char ) SET @Word_Start = 0 END END SET @Position = @Position - 1 END END ELSE BEGIN -- Capitalize the first character SET @Position = 0 WHILE @Position < DATALENGTH( @String ) BEGIN SET @Position = @Position + 1 SET @Char = UPPER( SUBSTRING( @String, @Position, 1 ) ) IF @Char BETWEEN ’A’ AND ’Z’ OR @Char BETWEEN ’0’ AND ’9’ BEGIN SET @String = STUFF( @String, @Position, 1, @Char ) SET @Position = 9999 END END END RETURN( @String ) END go
小结
SQL Server 2000 的 UDF的应用是很广泛的,它会给编程人员带来极大的便利。您可以建立自己的’system’ UDF,存在Master数据库中,可以为任何数据库进行调用。
UDF也有不足,我们知道系统函数可以任意调有,不管您使用大写、小写或者大小写混合。UDF却不行,它是大小写敏感的。
在未来的版本中,我希望微软为UDF增加默认值的功能,以后我们可以这样定义一个函数。
CREAT FUNCTION dbo.Test_default ( @parm int = 0 ) RETURN INT AS BEGIN RETURN ( @parm ) END
UDF中诸如此类的小问题还有不少,希望UDF的功能越来越强大,我们编程人员工作起来就会越来越轻松。
很多使用Windows 7系统的朋友都想小编反应,假如暂停使用电脑,鼠标会出现停顿现象,这是怎么回事呢 该怎么解决呢 下面就和小编一起去看下Windows 7 usb鼠标停顿的解决方法吧。 由于Windows 7系统中有一项USB选择性暂停造成的。这项设置主要为了节电,当他检测到用户没有对系统进行...
在Windows 7系统的默认设置中,当Windows 7系统处于休眠状态时,会同时断网的。如此一来,无论你正在使用迅雷还是快车等下载工具,同样可以在休眠状态下继续完成下载,最大限度做到从身边的小事开始支持环保。下面我们就详细介绍操作步骤,帮助Windows 7系统用户实现这一节能目标。 首先需要...
Windows 7 64位系统开机后提示"press any key to restart",无法进入系统了,具体现象如下所示: 故障分析: 故障的主要原因还是硬盘的问题,可以先检查是不是接触不良或坏了,进行修复或更换即可。 解决方法: 1、开机按F8不动到高级选项出现在松手,选“...
有些使用本本的朋友可能会发现,右下角通知栏区域会无法显示电源按钮,导致在插上电源或者是使用电池的时候都无法进行区分。造成这种情况大部分都是因为使用了第三方修改过的系统版本或者对于系统优化过度,所以今天就来解决这个问题。 第一步:在开始菜单的搜索窗口输入“gpedit.msc”,进入组策略编辑器,依...
在使用Windows 7的时候很多用户对于系统的很多功能并不是很了解,也正是因为这样的不了解导致很多用户在使用Win 之后并不能体验Windows 7的功能便携和强大功能,导致很多用户对于Windows 7的认识还是比较模糊,不过为了让更多的朋友了解Windows 7的特点和便携应用,今天就为大家汇...
出现该问题的原因是由于使用第三方优化软件消除快捷方式的小箭头引起的。 1、在开始搜索框中键入“regedit”,按回车键打开注册表编辑器。 2、依次定位到以下分支:HKEY_CLASSES_ROOTlnkfile。 3、在lnkfile项上鼠标右键单击“新建”——“字符串值”。...