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 Server中通过拆分字符串来模拟数组

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

SQL字符串转换为数组

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

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

能把容器和数组中的的数据转换成为sql语句中能够用的上的句子。这样就方便很多 /** * 把数组或者容器转换成为字符串形式 用逗号隔开 * */ public static String...

SQL字符串转换为数组

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

SQL字符串转换为数组

转于:http://www.cnblogs.com/wuhuisheng/archive/2013/01/17/2865008.html /* 一、按指定符号分割字符串,返回分割后的元素个数,方法很...
  • hyrg_
  • hyrg_
  • 2013-09-06 11:51
  • 578

SQL自定义函数split分隔字符串

SQL自定义函数split分隔字符串

实现一个以空白符分隔字符串的split函数

【阅读提示】通过本文你将实际了解如何用gcc/g++编译多个c/cpp文件;如何实现将一行字符串分隔成单个单词的split函数;另外还将看到一些常见的错误处理办法以及如何将一个程序分成几个cpp文件的...

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

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

使用SQL函数[Split]分割字符串,并放入内存表中

今天遇到一个SQL方法的编写,需要使用到 SELECT * FROM USER WHERE ID IN(@uid) @uid为字符串,但是ID是INT类型,无法编译运行,需要使用下面的函数 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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