SQLServer2000UDF深度发掘如何进行?

我们今天主要向大家讲述的是对SQL Server 2000 UDF进行深度发掘的实际操作,即Microsoft SQL Server 2000数据库的新增特性—用户的User-Defined Function(UDF)自定义函数,并演示几个常用的实例。

成都创新互联公司主营府谷网站建设的网络公司,主营网站建设方案,重庆APP开发公司,府谷h5微信小程序开发搭建,府谷网站营销推广欢迎府谷等地区企业咨询

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

网页标题:SQLServer2000UDF深度发掘如何进行?
文章URL:http://www.36103.cn/qtweb/news31/33881.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联