SQL Server 2000 UDF深度发掘如何进行?

数据库 SQL Server
我们今天是要和大家一起讨论的是对SQL Server 2000 UDF进行深度发掘的实际操作,以下就是文章的主要内容的详细介绍。

我们今天主要向大家讲述的是对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的语法如下:

 

  1. CREATE FUNCTION [ owner_name.] function_name   
  2. ( { { @parameter_name scalar_parameter_data_type   
  3. [,…n] ] )   
  4. RETURN scalar_return_data_type   
  5. [WITH < function_option> [, … n]]   
  6. [AS]   
  7. BEGIN   
  8. Function_body   
  9. RETURN scalar_expression   
  10. 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的应用。

  1. Greatest and Least  

为了区别于系统函数Max和Min,我给新函数命名为Greatest和Least,它们会从以参数形式输入的两个值中找出***值和最小值。

Case语句是两个函数的核心:

CASE WHEN value1 > value2 THEN value1 ELSE value2 END

虽然函数很简单,但用途是很广的。

  1. CREATE FUNCTION dbo.Greatest   
  2. -- Return the maximum of two parameters   
  3. (@Val1 SQL_VARIANT,   
  4. @Val2 SQL_VARIANT)   
  5. RETURNS SQL_VARIANT   
  6. AS   
  7. BEGIN   
  8. RETURN (CASE WHEN @val1 > @val2 THEN @val1 ELSE @val2 END)   
  9. END   
  10. go   
  11.  
  12. CREATE FUNCTION dbo.Least   
  13. -- Return the minimum of two parameters   
  14. ( @val1 SQL_VARIANT,   
  15. @val2 SQL_VARIANT )   
  16. RETURNS SQL_VARIANT   
  17. AS   
  18. BEGIN   
  19. RETURN (CASE WHEN @val1 < @val2 THEN @val1 ELSE @val2 END)   
  20. END   
  21. Go   

大小写转换函数

该函数有两个参数:@String和@Capitalize_What。

依据 @Capitalize_What的值,函数有不同的功能:

¨ @Capitalize_What = ‘string’“

函数将 @string的***个非空字符转换成大写, 其余部分改为小写。

¨ @Capitalize_What = ‘sentence’

函数将 @string中的每一句的***非空字符转换为大写,句子其余部分转换为小写。断句的依据是’.’、’!’、’?’

¨ @Capitalize_What = ‘word’

函数将 @string中的每个词都转换成首字符大写,其余小写的形式。

  1. CREATE FUNCTION dbo.Capitalize (  
  2. -- Capitalize the first character of every word,  
  3. -- sentence, or the whole string. Put the rest to lowercase.  
  4. @String VARCHAR (8000),  
  5. @Capitalize_What VARCHAR (8) = ’string’  
  6. -- String: Capitalize the first letter of the string  
  7. -- Sentence: Capitalize the first letter of every sentence.  
  8. -- Delimiters: ./!/?  
  9. -- Word: Capitalize the first letter of every word.  
  10. -- Delimiters: any characters other than letters and digits.  
  11. )  
  12. RETURNS VARCHAR(8000)  
  13. AS  
  14. BEGIN  
  15. DECLARE @Position SMALLINT,  
  16. @Char CHAR(1),  
  17. @First_Char CHAR (1),  
  18. @Word_Start SMALLINT  
  19. SET @Capitalize_What = LOWER( @Capitalize_What )  
  20. SET @Word_Start = 0 
  21. IF @Capitalize_What IN (‘word’, ‘sentence’)  
  22. BEGIN  
  23. SET @Position = DATALENGTH( @String )  
  24. WHILE @Position >= 0 BEGIN  
  25. SET @Char = CASE @Position  
  26. WHEN 0 THEN ’.’  
  27. ELSE UPPER( SUBSTRING(  
  28. @String, @Position,  
  29. 1 ) )  
  30. END  
  31. IF @Char BETWEEN ’A’ AND ’Z’  
  32. OR @Char BETWEEN ’0’ and ’9’ BEGIN  
  33. SET @Word_Start = @Position  
  34. SET @First_Char = UPPER( @Char )  
  35. END  
  36. ELSE BEGIN  
  37. IF @Capitalize_What = ’word’  
  38. OR @Char in ( ’.’, ’!’, ’?’ ) BEGIN  
  39. IF @Word_Start > 0  
  40. AND @First_Char BETWEEN ’A’  
  41. AND ’Z’  
  42. SET @String = STUFF(  
  43. @String, @Word_Start,  
  44. 1, @First_Char )  
  45. SET @Word_Start = 0 
  46. END  
  47. END  
  48. SET @Position = @Position - 1  
  49. END  
  50. END  
  51. ELSE BEGIN -- Capitalize the first character  
  52. SET @Position = 0 
  53. WHILE @Position < DATALENGTH( @String )  
  54. BEGIN  
  55. SET @Position = @Position + 1  
  56. SET @Char = UPPER( SUBSTRING( @String,  
  57. @Position, 1 ) )  
  58. IF @Char BETWEEN ’A’ AND ’Z’  
  59. OR @Char BETWEEN ’0’ AND ’9’ BEGIN  
  60. SET @String = STUFF( @String,  
  61. @Position, 1, @Char )  
  62. SET @Position = 9999 
  63. END  
  64. END  
  65. END  
  66. RETURN( @String )  
  67. END  
  68. go   

小结

SQL Server 2000 的 UDF的应用是很广泛的,它会给编程人员带来极大的便利。您可以建立自己的’system’ UDF,存在Master数据库中,可以为任何数据库进行调用。

UDF也有不足,我们知道系统函数可以任意调有,不管您使用大写、小写或者大小写混合。UDF却不行,它是大小写敏感的。

在未来的版本中,我希望微软为UDF增加默认值的功能,以后我们可以这样定义一个函数。

  1. CREAT FUNCTION dbo.Test_default  
  2. ( @parm int = 0 )  
  3. RETURN INT  
  4. AS  
  5. BEGIN  
  6. RETURN ( @parm )  
  7. END  

UDF中诸如此类的小问题还有不少,希望UDF的功能越来越强大,我们编程人员工作起来就会越来越轻松。

 

【编辑推荐】

  1. SQL Server数据库在安装时的注意事项
  2. SQL Server 2005 Express混合模式登录的设置
  3. SQL Server 2005数据库安装实例演示
  4. SQL Server 2000全文检索的使用方案描述
  5. SQL Server数据库与identity列
责任编辑:佚名 来源: 颜开的博客
相关推荐

2010-07-09 13:01:50

SQL Server

2010-07-19 11:10:58

SQL Server

2010-07-22 16:13:53

2011-08-02 15:39:30

SQL Server iSql

2015-10-15 09:53:46

SQL恢复

2010-07-14 17:37:33

SQL Server

2010-04-20 15:41:38

Oracle sql

2010-06-02 13:44:51

WIN2000 IPv

2009-07-17 17:41:25

JDBC连接SQL S

2010-09-24 18:47:23

SQL数据分页

2013-12-02 15:36:31

Windows Ser系统映像还原Windows Ser

2013-02-21 10:32:29

Win Server 灾难恢复虚拟机

2010-06-18 10:34:38

SQL Server

2010-07-09 11:22:18

SQL Server

2010-09-17 13:35:30

SQL跨表更新

2010-11-10 15:23:55

SQL SERVER

2011-04-18 13:02:08

SQL Server SQL Server

2010-09-28 14:52:37

SQL表结构

2010-06-18 13:18:29

SQL Server

2010-07-26 10:30:13

SQL Server
点赞
收藏

51CTO技术栈公众号