UDF—SQL Server 2000的新特性

本文将介绍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 SMALLINT,

@Char CHAR(1),

@First_Char CHAR (1),

@Word_Start SMALLINT

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的功能越来越强大,我们编程人员工作起来就会越来越轻松。

时间: 2024-09-30 02:33:50

UDF—SQL Server 2000的新特性的相关文章

SQL Server 2000 的新特性

1.2 SQL Server 2000 的新特性SQL Server 2000 全面扩展了SQL Server 7.0 的性能可靠性和易用性使它成为一个杰出的数据库平台可用于大型联机事务处理数据仓库以及电子商务等SQL Server 2000 的新特性主要有以下内容 1.2.1 数据库增强SQL Server 2000 引进了数据库和服务器增强功能以及其它一些新的特性1 XML Extensible Markup Language 扩展标示语言支持关系数据库引擎可以返回XML 文档数据XML 数

MS SQL基础教程:SQL Server 2000的新特性

1.2 SQL Server 2000 的新特性 SQL Server 2000 全面扩展了SQL Server 7.0 的性能可靠性和易用性使它成为一个杰出的数据库平台可用于大型联机事务处理数据仓库以及电子商务等 SQL Server 2000 的新特性主要有以下内容 1.2.1 数据库增强 SQL Server 2000 引进了数据库和服务器增强功能以及其它一些新的特性 1 XML Extensible Markup Language 扩展标示语言支持 关系数据库引擎可以返回XML 文档数据

SQL Server 2000的新特性:bigint数据类型

尽管int依然是SQL Server 2000中最主要的整数数据类型,但是SQL Server 2000还是新增加了整数数据类型bigint,它应用于整数超过int数据范围的场合. int数据类型所表示的数值范围从-2^31到2^31-1,也就是说,你可以用int数据类型来表达-2,147,483,648到2,147,483,647(即大约正负二十亿)之间的整数.一个int型占用四个字节的存储空间. 而bigint可以精确的表示从-2^63到2^63-1(即从-9,223,372,036,854

SQL Server 2012 FileTable 新特性详解

FileTable是基于FILESTREAM的一个特性.有以下一些功能: •一行表示一个文件或者目录. •每行包含以下信息: • •file_Stream流数据,stream_id标示符(GUID). •用户表示和维护文件及目录层次关系的path_locator和parent_path_locator •有10个文件属性 •支持对文件和文档的全文搜索和语义搜索的类型列. •filetable强制执行某些系统定义的约束和触发器来维护命名空间的语义 •针对非事务访问时,SQL Server配置FIL

SQL Server 2014 BI新特性(一) Excel下的Data Explorer

Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛. 此文是在微软商业智能官方博客里找到的,我在这里不仅将其简单的翻译过来,同时也加入了一些个人的感悟和笔记,如果你对原文感兴趣可以点击下面的链接查看原文; http://blogs.msdn.com/b/microsoft_business_intelligence1/archive/2013/05/15/5-things-you-

SQL Server 2008的新特性概述:集成服务

SSIS(SQL Server集成服务)是一个嵌入式应用程序,用于开发和执行ETL(解压缩.转换和加载)包.SSIS代替了SQL 2000的DTS.整合服务功能既包含了实现简单的导入导出包所必需的Wizard导向插件.工具以及任务,也有非常复杂的数据清理功能.SQL Server 2008 SSIS的功能有很大的改进和增强,比如它的执行程序能够更好地并行执行.在SSIS 2005,数据管道不能跨越两个处理器.而SSIS 2008能够在多处理器机器上跨越两个处理器 .而且它在处理大件包上面的性能得

SQL Server 2014 BI新特性(三)Power Query和Power Map功能预览

Power Query和Power Map是微软前不久在WPC上发布的Power BI中新的针对Excel的功能.借助这两样功能,自助式BI将更方便你发现和处理数据并且丰富数据的可视化功能. Power Query和Power Map的前身分别是Data Explorer和GeoFlow,这两样功能在SQL Server 2014 CTP1里都有提到.结合Power Pivot和Power View,这四大功能组成了微软最新的Power BI系列. 本文源自微软商业智能官方博客里的内容,主要演示

SQL Server 2014 BI新特性(二)结合Data Explorer和GeoFlow进行数据分析

Data Explorer和GeoFlow作为Excel的新功能被写入到即将发布的SQL Server 2014当中.Data Explorer为业务分析人员提供了一种数据获取,整理以及组织的方式,通过GeoFlow功能,数据将被形象地展现在3D地球中,使数据中蕴含的信息更形象更有说服力. Data Explorer下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=36803 GeoFlow下载地址: http://www

SQL Server 2008 R2新特性:主数据管理

提供对硬件资源进行深入监控的仪表.报表之类的,可以帮助用户调优SQL Server,提高硬件资源的发挥和保证系统的健康运行. SSMS得到了进一步的增强,以提供更多的功能.策略.报表等来帮助用户管理数据库. 提供了主数据服务(MDS),企业中的主数据可以直接通过SQL Server进行管理了. 在BI上进行了加强,新的"data mash up"功能实现了数据的收集.集成,数据集成工作变得更强大更容易:提供了Excel 2010的插件用于在Excel中进行数据分析:报表的设计和展示也进