标题: MSSQL教程之UDF―SQL Server 2000的新特征 [打印本页] 作者: 只想知道 时间: 2015-1-16 22:20 标题: MSSQL教程之UDF―SQL Server 2000的新特征 InnoDB数据表的索引,与InnoDB数据表相比,在InnoDB数据表上,索引对InnoDB数据表的重要性要大得多。在InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。本文将先容MicrosoftSQLServer2000的新增特征―用户自界说函数User-DefinedFunction(UDF),并演示几个经常使用的实例。
UDF的功效相似SQLServer中内建的体系函数,如CONVERT、SUBSTRING、DATAADD、GETDATA、ISNULL等等。一个UDF能够没有参数,大概带有一个或多个参数,函数运转后将会前往一个函数值。界说UDF的语法以下:CREATEFUNCTION[owner_name.]function_name
({{@parameter_namescalar_parameter_data_type
[,…n]])
RETURNscalar_return_data_type
[WITH<function_option>[,…n]]
[AS]
BEGIN
Function_body
RETURNscalar_expression
END
每一个UDF能够带有0个到1024个参数,每一个参数能够是除timestamp、cursor、table之外一切的数据范例;函数前往值的限定要更多一些,它不成所以text、ntext、image、timestamp、cursor和table。
函数体是UDF的次要部分,它有两个选项:ENCRYOTION和SCHEMABINDING。
SCHEMABINDING是SQLServer2000的新增功效,能够和视图一同利用。该选项不同意删除和修正被该函数援用的工具。如许能够避免有效的函数和视图对它们援用的工具举行布局上的修正。
人人会注重到函数体以Begin入手下手,End停止。这一点分歧于创立存储历程、触发器和视图。当您忘了写上Begin/End时,体系会前往一个提醒信息“Incorrectsyntaxnear‘RETURN’”。为何不间接说少了Begin/End,这有点让人隐晦。
上面我用几个例子来讲明UDF的使用。
GreatestandLeast
为了区分于体系函数Max和Min,我给新函数定名为Greatest和Least,它们会从以参数情势输出的两个值中找出最年夜值和最小值。
Case语句是两个函数的中心:
CASEWHENvalue1>value2THENvalue1ELSEvalue2END
固然函数很复杂,但用处是很广的。
CREATEFUNCTIONdbo.Greatest
--Returnthemaximumoftwoparameters
(@Val1SQL_VARIANT,
@Val2SQL_VARIANT)
RETURNSSQL_VARIANT
AS
BEGIN
RETURN(CASEWHEN@val1>@val2THEN@val1ELSE@val2END)
END
go
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
CREATEFUNCTIONdbo.Least
--Returntheminimumoftwoparameters
(@val1SQL_VARIANT,
@val2SQL_VARIANT)
RETURNSSQL_VARIANT
AS
BEGIN
RETURN(CASEWHEN@val1<@val2THEN@val1ELSE@val2END)
END
Go
巨细写转换函数
该函数有两个参数:@String和@Capitalize_What。
根据@Capitalize_What的值,函数有分歧的功效:
¨@Capitalize_What=‘string’“
函数将@string的第一个非空字符转换成年夜写,其他部分改成小写。
¨@Capitalize_What=‘sentence’
函数将@string中的每句的首个非空字符转换为年夜写,句子其他部分转换为小写。断句的根据是’.’、’!’、’?’
¨@Capitalize_What=‘word’
函数将@string中的每一个词都转换成首字符年夜写,其他小写的情势。
CREATEFUNCTIONdbo.Capitalize(
--Capitalizethefirstcharacterofeveryword,
--sentence,orthewholestring.Puttheresttolowercase.
@StringVARCHAR(8000),
@Capitalize_WhatVARCHAR(8)=’string’
--String:Capitalizethefirstletterofthestring
--Sentence:Capitalizethefirstletterofeverysentence.
--Delimiters:./!/?
--Word:Capitalizethefirstletterofeveryword.
--Delimiters:anycharactersotherthanlettersanddigits.
)
RETURNSVARCHAR(8000)
AS
BEGIN
DECLARE@PositionSMALLINT,
@CharCHAR(1),
@First_CharCHAR(1),
@Word_StartSMALLINT
SET@Capitalize_What=LOWER(@Capitalize_What)
SET@Word_Start=0
IF@Capitalize_WhatIN(‘word’,‘sentence’)
BEGIN
SET@Position=DATALENGTH(@String)
WHILE@Position>=0BEGIN
SET@Char=CASE@Position
WHEN0THEN’.’
ELSEUPPER(SUBSTRING(
@String,@Position,
1))
END
IF@CharBETWEEN’A’AND’Z’
OR@CharBETWEEN’0’and’9’BEGIN
SET@Word_Start=@Position
SET@First_Char=UPPER(@Char)
END
ELSEBEGIN
IF@Capitalize_What=’word’
OR@Charin(’.’,’!’,’?’)BEGIN
IF@Word_Start>0
AND@First_CharBETWEEN’A’
AND’Z’
SET@String=STUFF(
@String,@Word_Start,
1,@First_Char)
SET@Word_Start=0
END
END
SET@Position=@Position-1
END
END
ELSEBEGIN--Capitalizethefirstcharacter
SET@Position=0
WHILE@Position<DATALENGTH(@String)
BEGIN
SET@Position=@Position+1
SET@Char=UPPER(SUBSTRING(@String,
@Position,1))
IF@CharBETWEEN’A’AND’Z’
OR@CharBETWEEN’0’AND’9’BEGIN
SET@String=STUFF(@String,
@Position,1,@Char)
SET@Position=9999
END
END
END
RETURN(@String)
END
go