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字符串转换为数组

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

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

sql语句 in传入数组解决方法

SQL字符串转换为数组

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

SQL字符串转为Int表函数StringToIntArray

FUNCTION [dbo].[Fun_StringToIntArray] ( @str NTEXT ) RETURNS @table TABLE...

SQL Server中通过拆分字符串来模拟数组

数组是非常方便的一种数据结构,但在sql server中却不被支持,故编写储存过程时非常不便,我们可以将多个字符串用特定的连接字符连接起来作为参数,需要时再拆开,从而达到模拟字符串的目的,实现方法是建...
  • gatr
  • gatr
  • 2008年03月31日 13:15
  • 2771

mssql将字符串拆分为数组

Create function [dbo].[split](@SourceSql varchar(max),@StrSeprate varchar(10))returns @temp table(li...

ORACLE(PL/SQL) 根据字符分割(SPLIT)字符串返回数组

ORACLE没有提供现成的函数来进行字符串的分割,网上有很多中现实方法,本文介绍一种我自己的实现方式。主要是使用Oracle内部函数instr和substr函数的方式来实现。...

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

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

将string数组转化为sql的in条件

例如:我想将String[] str = {"4","5","6"}转化为“‘4’,‘5’,‘6’”字符串。这样我就可以用sql查询:select * from tableName id in (字符...

String数组转换拼接成SQL in条件字符串

public String delaType(String types){ StringBuffer sb = new StringBuffer(); for(int i=0;i //主要判断是否是最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL自定义函数split 将数组(分隔字符串)返回阵列(表)
举报原因:
原因补充:

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