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 AUTHID DEFINER is TABLE OF TYPE_ROW_SPLITSTR;
--3、建立自定义函数
CREATE OR REPLACE FUNCTION 自定函数名称(
strval IN TEXT,
splitstr IN CHAR(1)
)
RETURN TYPE_TABLE_SPLITSTR
AUTHID DEFINER
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,',','));