7、MSSQL存储函数

标量值函数

1:字符串拼接函数

-- Author:		wyq
-- Create date: 2019年11月18日 14:14:06
-- Description: 测试标量值函数
-- =============================================
IF OBJECT_ID('Function_Name','FN') IS NOT NULL
BEGIN
    DROP FUNCTION Function_Name;
END
GO 
CREATE FUNCTION Function_Name(@Parm NVARCHAR(10)) 
RETURNS NVARCHAR(20)  --函数返回值类型
AS
BEGIN
--SQL编写
	DECLARE @ResultVar NVARCHAR(20);
	SET  @ResultVar='你好:'+@Parm;
	RETURN @ResultVar;

END
GO

--执行
--SELECT  dbo.Function_Name('小米')

2:数值相加函数

if (object_id('fun_add', 'fn') is not null)
    drop function fun_add
go
create function fun_add(@num1 int, @num2 int)
    returns int
with execute as caller
as
    begin
        declare @result int;
        if (@num1 is null)
            set @num1 = 0;
        if (@num2 is null)
            set @num2 = 0;
        set @result = @num1 + @num2;
        return @result;
    end
go

表值函数

1:字符串分隔函数

-- Author:		wyq
-- Create date: 2019年11月18日 14:14:06
-- Description: 测试表值函数
-- =============================================
IF OBJECT_ID('Fun_SpitString','TF') IS NOT NULL
BEGIN
    DROP FUNCTION Fun_SpitString;
END
GO 
/*按照符号分割字符串*/
CREATE FUNCTION [dbo].[Fun_SpitString](@String VARCHAR(2000),@SplitChar VARCHAR(2))   
  RETURNS @Tem TABLE(ID INT IDENTITY(1,1),Value NVARCHAR(200))   
  AS   
    BEGIN   
      WHILE(CHARINDEX(@SplitChar,@String)<>0)--还有分隔符进入循环体   
        BEGIN   
          INSERT INTO @Tem(Value) 
		  VALUES (SUBSTRING(@String,1,CHARINDEX(@SplitChar,@String)-1))--裁剪字符串从第一个到分隔符处不包含分隔符
          SET @String = STUFF(@String,1,charindex(@SplitChar,@String),'') --相当于切割字符
        END   
      INSERT @Tem(Value) VALUES (@String)   
      RETURN   
END
  
/*测试
select * from dbo.[Fun_SpitString]('L,M,N,O,P',',')
*/

查看自定义函数

select definition,* from sys.sql_modules m join sys.objects o on m.object_id = o.object_id
and type in('fn', 'if', 'tf');

内置函数

--用的函数
--CHARINDEX(expressionToFind,expressionToSerach,[start_position])
--表示从expressionToSerach中找到第一个expressionToFind的位置
SELECT CHARINDEX(',','A,B,C,D'); --返回2标识,在第二个字符位置

--SUBSTRING(expression,start_position,length)
--表示从expression的start_position位置后的length个字符切出
SELECT SUBSTRING('A,B,C,D',1,CHARINDEX(',','A,B,C,D')-1) --返回A,切出第一个分隔符前的值

-- STUFF(expression1,start_position,length,expression2)
--表示从expression1的start_position位置后的length个字符用expression2替换
SELECT STUFF('A,B,C,D',1,2,'') --返回B,C,D
posted @ 2026-08-30 17:36  清哥的码农生活  阅读(2)  评论(0)    收藏  举报