标量函数和表值函数的创建和使用

存储过程可以创建或访问临时表,而函数不可以;同时函数不可以修改表中的数据,或调用产生副作用的函数

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  

 

posted @ 2023-02-28 14:07  RC城  阅读(291)  评论(0编辑  收藏  举报