改写sqlserver表值函数;
写的不对的地方,还请批评指正!
返回表类型数据的用户自定义函数。表值函数的返回类型是表,因此,可以像使用表一样使用表值函数。
https://eco.dameng.com/document/dm/zh-cn/pm/dm8_sql-various-control.html
CREATE function [dbo].[dF_tblSplitString]
(
@nstrInput nvarchar(max), --被特定字符分隔的字符串
@nstrSeparator nvarchar(5)='、', --分隔符
@bitRemoveEmptyEntries bit=1 --1-不包含空值,0-包含空值
)
--是可以直接返回表类型
returns @tblReturn table
(
[Id] int identity(1,1),
[Val] nvarchar(200)
)
as
begin
declare @intIndex int, @nstrTmp nvarchar(4000)
set @intIndex = charindex(@nstrSeparator,@nstrInput)
while (@intIndex>0)
begin
set @nstrTmp=ltrim(rtrim(substring(@nstrInput, 1, @intIndex-1)))
if (@bitRemoveEmptyEntries=0) or (@bitRemoveEmptyEntries=1 and @nstrTmp<>'')
begin
insert into @tblReturn([Val]) Values(@nstrTmp)
end
set @nstrInput = substring(@nstrInput, @intIndex+datalength(@nstrSeparator)/2, len(@nstrInput))
set @intIndex = charindex(@nstrSeparator, @nstrInput)
end
set @nstrTmp=ltrim(rtrim(@nstrInput))
if (@bitRemoveEmptyEntries=0) or (@bitRemoveEmptyEntries=1 and @nstrTmp<>'')
begin
insert into @tblReturn([Val]) Values(@nstrTmp)
end
return
end
用法:select VAL from dbo.dF_tblSplitString('1=1&','&',1)
--这个当然不是我自己写的,有社区老师回答别人的,有百度到的,最后自己简单优化了一下;
--1.建记录的数据类型
CREATE OR REPLACE TYPE TYPE_ROW_SPLITSTR AS OBJECT (
id INT,
val NVARCHAR(500)
);
--2.建表的行类型
CREATE OR REPLACE TYPE TYPE_TABLE_SPLITSTR
is TABLE OF TYPE_ROW_SPLITSTR;
--3、建立自定义函数
CREATE OR REPLACE FUNCTION 自定函数名称(
strval IN TEXT,
splitstr IN CHAR(1)
)
RETURN TYPE_TABLE_SPLITSTR
PIPELINED
AS
R Type_Row_SplitStr; --每一行
i INT; --自定义截取字符串开始值
id INT; --自定ID
tmpstr1 TEXT; --截取后的值
BEGIN
id:=1;
--INSTR(char1,char2[,n,[m]])
--从 char1 的第 n 个字节开始查找字符串 char2 的第 m 次出现的位置,以字数计算
--其他函数可以参阅【sql 语言使用手册】中函数
i:=INSTR(strval,splitstr);
while i>0
loop
tmpstr1 :=substring(strval,1,i-1);
strval :=substring(strval,i+1,len(strval)+i);
R := Type_Row_SplitStr(id, tmpstr1);
PIPE ROW (R);
i :=INSTR(strval,splitstr);
id :=id+1;
end loop;
if ifnull(strVal,'')<>''
then
R := Type_Row_SplitStr(id,strVal);
PIPE ROW (R);
end if;
EXCEPTION
WHEN OTHERS THEN
--这块是自定义,可以直接print
INSERT INTO EXCEPTION_INFO(CODE,REMARK) VALUES (SQLCODE, 'KF_Pub_SplitStrByChar函数失败:'||SQLERRM||'代码行:'||$$PLSQL_LINE||'时间:'||getdate);
COMMIT;
END;
用法的:select * From table(函数名称('1,3,5,',','));
文章
阅读量
获赞