标量函数和表值函数的创建和使用
存储过程可以创建或访问临时表,而函数不可以;同时函数不可以修改表中的数据,或调用产生副作用的函数
1.标量函数 返回基类型。
--create function 标量函数名 --( --入参 入参类型 --) --return 出参类型 --as --Begin -- 语句处理 --end --案例 create function GetCodeByName( @Name varchar(50) ) returns varchar(50) as begin declare @Code varchar(50) select @Code=Code from PIUSER where REALNAME=@Name; return @code; end --调用标量函数 select dbo.GetCodeByName('王沛东')
2.表值函数 返回一个表
--创建表值函数 create function GetTable( @name varchar(50) ) returns @RtTbale table ( s# varchar(500), Sname varchar(500), Sage datetime, Ssex varchar(50))--返回的表结构 as begin insert into @RtTbale select * from Student where Sname=@name return end --使用表值函数 select * from dbo.GetTable('赵雷')
3.几个常用函数
获取逗号风格的字符串中的某一个
比如'1,2,4,5,6' 第三个就是4
CREATE function [dbo].[Get_StrArrayStrOfIndex] ( @str nvarchar(max), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(1024) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) end GO --调用获得5 select dbo.Get_StrArrayStrOfIndex('1,5,3',',',2)
按照某个符号分割字符串 翻来一张表
CREATE FUNCTION [dbo].[SplitStringToTable] ( @String nvarchar(4000), --格式如:“1,2,3,4,” @SplitChar nvarchar(10) --分割的字符:“,” ) RETURNS @table Table(ID varchar(100)) AS BEGIN DECLARE @Index INT SET @Index = 0 IF @String <> '' Begin IF RIGHT(@String,1)<> @SplitChar SET @String = @String + @SplitChar IF LEFT(@String,1)= @SplitChar SET @String = STUFF(@String, 1, 1, '') End WHILE CHARINDEX(@SplitChar,@String,@Index) > 0 BEGIN INSERT INTO @table(ID) VALUES (SUBSTRING(@String, @Index, CHARINDEX(@SplitChar, @String, @Index) - @Index)) SET @index = CHARINDEX(@SplitChar, @String, @Index) + 1 END RETURN END GO --调用 select * from [dbo].[SplitStringToTable]('1,1,9,0',',')
--生成拼音首码 alter FUNCTION fn_GetPy (@str nvarchar(4000)) returns nvarchar (4000) --WITH ENCRYPTION AS BEGIN DECLARE @intLen INT DECLARE @strRet nvarchar (4000) DECLARE @temp nvarchar (100) SET @intLen = len(@str) SET @strRet = '' WHILE @intLen > 0 BEGIN SET @temp = '' SELECT @temp = CASE WHEN SUBSTRING (@str ,@intLen, 1) >= '帀' THEN 'Z' WHEN SUBSTRING (@str ,@intLen, 1) >= '丫' THEN 'Y' WHEN SUBSTRING (@str ,@intLen, 1) >= '夕' THEN 'X' WHEN SUBSTRING (@str ,@intLen, 1) >= '屲' THEN 'W' WHEN SUBSTRING (@str ,@intLen, 1) >= '他' THEN 'T' WHEN SUBSTRING (@str ,@intLen, 1) >= '仨' THEN 'S' WHEN SUBSTRING (@str ,@intLen, 1) >= '呥' THEN 'R' WHEN SUBSTRING (@str ,@intLen, 1) >= '七' THEN 'Q' WHEN SUBSTRING (@str ,@intLen, 1) >= '妑' THEN 'P' WHEN SUBSTRING (@str ,@intLen, 1) >= '噢' THEN 'O' WHEN SUBSTRING (@str ,@intLen, 1) >= '拏' THEN 'N' WHEN SUBSTRING (@str ,@intLen, 1) >= '嘸' THEN 'M' WHEN SUBSTRING (@str ,@intLen, 1) >= '垃' THEN 'L' WHEN SUBSTRING (@str ,@intLen, 1) >= '咔' THEN 'K' WHEN SUBSTRING (@str ,@intLen, 1) >= '丌' THEN 'J' WHEN SUBSTRING (@str ,@intLen, 1) >= '铪' THEN 'H' WHEN SUBSTRING (@str ,@intLen, 1) >= '旮' THEN 'G' WHEN SUBSTRING (@str ,@intLen, 1) >= '发' THEN 'F' WHEN SUBSTRING (@str ,@intLen, 1) >= '妸' THEN 'E' WHEN SUBSTRING (@str ,@intLen, 1) >= '咑' THEN 'D' WHEN SUBSTRING (@str ,@intLen, 1) >= '嚓' THEN 'C' WHEN SUBSTRING (@str ,@intLen, 1) >= '八' THEN 'B' WHEN SUBSTRING (@str ,@intLen, 1) >= '吖' THEN 'A' ELSE rtrim( ltrim(SUBSTRING(@str ,@intLen, 1)) ) END --对于汉字特殊字符,不生成拼音码 IF (ascii(@temp) > 127) SET @temp = '' --对于英文中小括号,不生成拼音码 IF @temp = '(' OR @temp = ')' SET @temp = '' SELECT @strRet = @temp + @strRet SET @intLen = @intLen - 1 END RETURN LOWER (@strRet) end --调用 upper将小写换成大写 select UPPER( dbo.fn_GetPy(Sname))pym,Sname from Student