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(@charpos,
              
CharIndex(@Separator@charpos+ 1,
              
Len(@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)

二、
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
  
SET @sText = LTrim(Right(@sText,DATALENGTH(@sText- @iStrike))
  
  
END
  
ELSE
  
BEGIN
--If you can抰 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='abc,cdesefd,efddc,mgns,aa'
select * from fn_Split(@no,',')

第一个来源:http://blog.csdn.net/zhypmq/archive/2007/09/29/1807205.aspx(有改动)
posted on 2007-11-01 12:06  迷你软件  阅读(436)  评论(2编辑  收藏  举报

本网站绝大部分资源来源于Internet,本站所有作品版权归原创作者所有!!如有以下内容:章节错误、非法内容、作者署名出错、版权疑问、作品内容有违相关法律等请及时与我联系. 我将在第一时间做出响应!本站所有文章观点不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。