Correction to parsestring
The original function fails when a mistaken split char is being snet to the function.
This can easly be corrected by adding an if to check the value of the @holdpos inside the loop before sending it to the substring function
if the value is 0 then break the loop
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
/******************************************************************************
*File Name:dbo.parsestring
*File Desc:Will split out array data.
*Database:MASTER
*Language:MS Transact-SQL
*Version:MS SQL 2000
*
*Tables:N/A
*
*
*
*Procedures:N/A
*
*Date:1/13/2005
*Author:KILEY MILAKOVIC
*Architect:
*
*Special Comments/Warnings
*None
*
*******************************************************************************
*Function Name:dbo.parsestring
*
*Function Desc:Split out array data.
*
*Parameters:
* @txtarray varchar(2000)= Text to be parsed
* @delimit char(1) = delimiter used to delimIt array data
* @reccount int = number of objects in array
*
*RETURNS: @tabsplit table variable of all parsed values
*
*Notes:
*None
********************************************************************************/
ALTER FUNCTION dbo.parsestring (@txtarray varchar(2000), @delimit char(1),@reccount int)
RETURNS @tabsplit table(txtout varchar(300))
AS
BEGIN
declare @loopcount int,
@holdpos int,
@holdpos2 int
set @loopcount = 1
set @holdpos2 = 1
set @holdpos = 1
while (@loopcount <= @reccount)
begin
select @holdpos = charindex(@delimit,@txtarray,@holdpos + 1)
-- Added by Gil Adi
if @holdpos<>0 -- this if and else
begin
insert @tabsplit
select SUBSTRING (@txtarray, @holdpos2, @holdpos - @holdpos2)
Set @holdpos2 = @holdpos + 1
Set @loopcount = @loopcount + 1
end
else
break
end
--Added by Yin Zhang
if @holdpos < len(@txtarray)
begin
insert @tabsplit
select SUBSTRING (@txtarray, @holdpos2, len(@txtarray) - @holdpos2 + 1)
end
--End adding
RETURN
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SELECT * FROM [master].[dbo].[parsestring]('abcd,efg,hij,klm,no,pq,',',',6)
SELECT * FROM [master].[dbo].[parsestring]('abcd,efg,hij,klm,no,pq',',',10)
SELECT * FROM [master].[dbo].[parsestring]('abcd,efg,hij,klm,no,pq','#',4)