Arthur Fuller
artful at rogers.com
Mon Sep 1 15:07:25 CDT 2003
Thanks, Billy!
Here's my revised code:
<sql>
ALTER FUNCTION fn_StringToTable (@String varchar(100))
RETURNS @Values TABLE (ID int primary key)
AS
begin
declare @pos int
declare @value int
while @string > ''
begin
set @pos = charindex(',', @string)
if @pos > 0
begin
set @value = substring( @string, 1, @pos - 1)
select @string = LTrim(substring( @string, @pos + 1, LEN(@string)- at pos+1))
--select @string
insert @Values SELECT @value
end
else
IF len(@string) > 0
begin
set @value = @string
insert @Values SELECT @value
set @string = ''
end
else
set @string = ''
end
-- just to see what I'm doing
--SELECT * FROM @Values
RETURN
end
</sql>
It now works as it should, finding the '555' at the end, but the tests look
a little clumsy to me. Can you think of any optimizations?
-----Original Message-----
From: dba-sqlserver-bounces at databaseadvisors.com
[mailto:dba-sqlserver-bounces at databaseadvisors.com]On Behalf Of Billy
Pang
Sent: Monday, September 01, 2003 9:27 AM
To: dba-sqlserver at databaseadvisors.com
Subject: Re: [dba-SQLServer]Close but no cigar
You need a BEGIN --END GROUP for your WHILE loop. If you don't put one, then
SS only includes the next statement as part of your WHILE loop, in which
case produced an infinite loop.
BTW, select * from fn_StringToTable( '100, 200, 333, 444, 555') only
produces:
100
200
333
444
HTH
Billy
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.510 / Virus Database: 307 - Release Date: 8/14/2003