SQL自定义函数split 将数组(分隔字符串)返回阵列(表)

原创 2007年09月29日 23:31:00

 SQL自定义函数split

Create Function Split(@Strs As Nvarchar(1024),@Separator as Nvarchar(10),@Index as Int
Returns Nvarchar(1024As 
begin
     
Declare @i As Int@charpos As Nvarchar(1024)
     
Set @charpos = @Strs
     
Set @i = 1
     
If @Index < 0
            
Begin
              
Set @charpos = '超出下界'   
            
End
     
Else
       
Begin  
       
While @i <= (@Index - 1)
            
Begin
             
If CharIndex(@Separator@charpos> 0
              
Begin
                 
Set @charpos = Substring(@charposCharIndex(@Separator@charpos+ 1Len(@charpos- CharIndex(@Separator@charpos))
              
End
       
Else
       
Begin
         
Set @charpos = '超出上界'
         
Break
       
End
      
Set @i = @i + 1
    
End   

   
If @charpos <> '超出上界'
        
Begin
         
If CharIndex(@Separator@charpos> 0  
             
Begin
                   
Set @charpos = Left(@charposCharIndex(@Separator@charpos- 1)
              
End
        
End
      
End
     
Return @charpos
End
--调用
select dbo.Split('sdf|abc|csc|aldsfj|sfj|取出原素|asdf|adf|...','|',6)
--返回 取出原素

 将数组(分隔字符串)返回阵列(表)

--将数组(分隔字符串)返回阵列(表)
--
drop function fn_Split
--
自定义函数
CREATE  FUNCTION fn_Split(@sText nvarchar(4000), @sDelim varchar(20= ' ')
RETURNS @retArray TABLE (idx smallint Primary Key, value varchar(8000))
AS
    
BEGIN
        
DECLARE @idx smallint,
        
@value nvarchar(4000),
        
@bcontinue bit,
        
@iStrike smallint,
        
@iDelimlength tinyint
        
IF @sDelim = 'Space'
            
BEGIN
                
SET @sDelim = ' '
            
END
        
SET @idx = 0
        
SET @sText = LTrim(RTrim(@sText))
        
SET @iDelimlength = DATALENGTH(@sDelim)
        
SET @bcontinue = 1
        
IF NOT ((@iDelimlength = 0or (@sDelim = 'Empty'))
            
BEGIN
                
WHILE @bcontinue = 1
                  
BEGIN
                
--If you can find the delimiter in the text, retrieve the first element and
                --insert it with its index into the return table.

                      
IF CHARINDEX(@sDelim@sText)>0
                         
BEGIN
                             
SET @value = SUBSTRING(@sText,1CHARINDEX(@sDelim,@sText)-1)
                                
BEGIN
                                    
INSERT @retArray (idx, value) VALUES (@idx@value)
                                
END
                          
                        
--Trim the element and its delimiter from the front of the string.
                          --Increment the index and loop.
                            SET @iStrike = DATALENGTH(@value+ @iDelimlength
                            
SET @idx = @idx + 1
                            
if @idx=12
                                
begin
                                   
set @bcontinue=0
                                
end
                            
SET @sText = LTrim(right(@sText,(DATALENGTH(@sText- @iStrike)/2))                                                
                         
END                            
                      
ELSE
                          
BEGIN
                        
--If you can't find the delimiter in the text, @sText is the last value in
                        --@retArray.
                            SET @value = @sText
                                
BEGIN
                                    
INSERT @retArray (idx, value)
                                    
VALUES (@idx@value)
                                
END
                          
--Exit the WHILE loop.
                            SET @bcontinue = 0
                          
END
                  
END
            
END
        
ELSE
            
BEGIN
                
WHILE @bcontinue=1
                    
BEGIN
                  
--If the delimiter is an empty string, check for remaining text
                  --instead of a delimiter. Insert the first character into the
                  --retArray table. Trim the character from the front of the string.
                --Increment the index and loop.
                      IF DATALENGTH(@sText)>1
                          
BEGIN
                            
SET @value = SUBSTRING(@sText,1,1)
                                
BEGIN
                                    
INSERT @retArray (idx, value) VALUES (@idx@value)
                                
END
                             
SET @idx = @idx+1
                             
SET @sText = SUBSTRING(@sText,2,DATALENGTH(@sText)-1)      
                          
END
                      
ELSE
                          
BEGIN
                          
--One character remains.
                          --Insert the character, and exit the WHILE loop.
                             INSERT @retArray (idx, value) VALUES (@idx@sText)
                             
SET @bcontinue = 0 
                          
END
                    
END
            
END
      
RETURN
    
END
--测试
declare @no char(100)
set @no='china 中国,%…-- desefd,e 中国人fddc,mgns,a a'
select * from fn_Split(@no,',')

--返回结果
idx        [value]
0        china 中国
1        %…-- desefd
2        e 中国人fddc
3        mgns
4        a a


上面的判断太多了不易于理解,下面转了一个简单的意思基本相同代码简单很多

 

-- =============================================
--
 Author:  阿瑞
--
 Create date: 2008-03-19
--
 Description: split函数
--
 Debug:select * from dbo.Fun_Split('ABC:BC:C:D:E',':') 
--
 =============================================
CREATE FUNCTION [dbo].[Fun_Split] 
(
 
@SourceSql varchar(8000), 
 
@StrSeprate varchar(10)
)
RETURNS 
 @TEMP_Table TABLE (a varchar(100))
AS
BEGIN
 
DECLARE @i int
 
SET @SourceSql=rtrim(ltrim(@SourceSql))
 
SET @i=charindex(@StrSeprate,@SourceSql)
 
WHILE @i>=1
   
BEGIN
    
INSERT @TEMP_Table VALUES(left(@SourceSql,@i-1))
    
SET @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
    
SET @i=charindex(@StrSeprate,@SourceSql)
 
END
 
if @SourceSql<>'/'
  
INSERT @TEMP_Table values(@SourceSql)
 
RETURN 
END

 

 

 

调用:select * from dbo.Fun_Split('ABC:BC:C:D:E',':')

结果:

 

Sql中数组的定义和使用

Sql中数组的定义和使用首先你需要定义一个数组类型,然后定义这个数组变量       declare       type   a_type   is   table   of   number;  ...
  • hcjy0826
  • hcjy0826
  • 2008年04月24日 13:09
  • 2334

一行代码解决 sql语句 in传入数组变字符串

sql语句 in传入数组解决方法
  • zzwwjjdj1
  • zzwwjjdj1
  • 2016年10月25日 16:18
  • 6225

SQL SERVER传入数组到到存储过程

假如我有数组:a(1)=111,a(2)=222,a(3)=333……w我要把数组传入存储过程,但SQLSERVER不支持数组,搜索baidu,找到一个很强的方法:1、先把数组转成一个以逗号分隔的字符...
  • bigcarp
  • bigcarp
  • 2005年08月17日 10:42
  • 3076

如何在T-sql 中实现数组的功能

T-SQL象数组一样处理字符串、分割字符串    在日常的编程过程中,数组是要经常使用到的。在利用SQL对数据库进行操作时,有时就想在SQL使用数组,比如将1,2,3,4,5拆分成数组。可惜的是在T-...
  • fuyouhu2008
  • fuyouhu2008
  • 2010年01月07日 14:48
  • 9754

如何在T-sql 中实现数组的功能

T-SQL象数组一样处理字符串、分割字符串    在日常的编程过程中,数组是要经常使用到的。在利用SQL对数据库进行操作时,有时就想在SQL使用数组,比如将1,2,3,4,5拆分成数组。可惜的是在T-...
  • huangtao2011
  • huangtao2011
  • 2014年07月04日 16:47
  • 2019

SQL字符串转换为数组

思路: 按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。——返回字符串数组长度函数create function Get_Str...
  • NextStand
  • NextStand
  • 2016年03月28日 17:40
  • 3984

SQL字符串转换为数组

SQL字符串转换为数组 原文转载自:http://hi.baidu.com/gagahjt/item/fd081316450f05028ebde413 /* 一、按指定符号分割字符串,返回分...
  • ccrong
  • ccrong
  • 2015年09月30日 10:30
  • 1227

MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法

MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法
  • diandian_520
  • diandian_520
  • 2014年08月30日 21:21
  • 23728

把数组或者对象转换成sql中能使用的字符串

能把容器和数组中的的数据转换成为sql语句中能够用的上的句子。这样就方便很多 /** * 把数组或者容器转换成为字符串形式 用逗号隔开 * */ public static String...
  • hfmbook
  • hfmbook
  • 2013年08月21日 15:53
  • 3075

sqlserver字符串拆分(split)方法汇总

declare @s varchar(100),@sql varchar(1000) set @s='1,2,3,4,5,6,7,8,9,10,11'  while(charindex(','...
  • tastelife
  • tastelife
  • 2012年08月28日 09:28
  • 35860
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL自定义函数split 将数组(分隔字符串)返回阵列(表)
举报原因:
原因补充:

(最多只允许输入30个字)