分割字符串,返回表之(管道表函数)

改写sqlserver表值函数

定义

  1.  SQLSERVER表值函数的定义:返回表类型数据的用户自定义函数。表值函数的返回类型是表,因此,可以像使用表一样使用表值函数。
    
  2.  达梦PIPE ROW(管道表函数) 语句:https://eco.dameng.com/document/dm/zh-cn/pm/dm8_sql-various-control.html
    

SQL Server代码

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,',','));
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的炸串拌饼店

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值