SQL自定义函数Split
一、
调用:
二、
第一个来源:http://blog.csdn.net/zhypmq/archive/2007/09/29/1807205.aspx(有改动)
Create Function Split(@Strs As Nvarchar(1024),@Separator as Nvarchar(10),@Index as Int)
Returns Nvarchar(1024) As
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(@charpos, CharIndex(@Separator, @charpos) - 1)
End
End
End
Return @charpos
End
Returns Nvarchar(1024) As
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(@charpos, CharIndex(@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 = 0) or (@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,1, CHARINDEX(@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
调用: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 = 0) or (@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,1, CHARINDEX(@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,',')
set @no='abc,cdesefd,efddc,mgns,aa'
select * from fn_Split(@no,',')
第一个来源:http://blog.csdn.net/zhypmq/archive/2007/09/29/1807205.aspx(有改动)