注册
改写sqlserver表值函数之DM管道表函数
技术分享/ 文章详情 /

改写sqlserver表值函数之DM管道表函数

阿杰升级路 2024/04/28 1685 0 0

需求

改写sqlserver表值函数;
写的不对的地方,还请批评指正!

SQLSERVER表值函数的定义:

返回表类型数据的用户自定义函数。表值函数的返回类型是表,因此,可以像使用表一样使用表值函数。

达梦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 
 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,',','));
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服