CSV, CDF string – Multiple In by string IN(“1,2,3,4,5″) etc
January 27th, 2009
CREATE FUNCTION CSVTable(@Str VARCHAR(7000)) RETURNS @t TABLE (numberval INT, stringval VARCHAR(100), DateVal datetime) AS BEGIN DECLARE @i INT; DECLARE @c VARCHAR(100); SET @Str = @Str + ',' SET @i = 1; SET @c = ''; while @i <= len(@Str) BEGIN IF SUBSTRING(@Str,@i,1) = ',' BEGIN INSERT INTO @t VALUES (CASE WHEN isnumeric(@c)=1 THEN @c ELSE NULL END, rtrim(ltrim(@c)), CASE WHEN isdate(@c)=1 THEN @c ELSE NULL END) SET @c = '' END ELSE SET @c = @c + SUBSTRING(@Str,@i,1) SET @i = @i +1 END RETURN END
Note that the above works for all datatypes — dates or text or numbers (ints only, but that could be fixed as well).
So, for example:
SELECT * FROM People WHERE People.Name IN (SELECT StringVal FROM dbo.CSVTable('Jeff,Bill,Pete,Eddy, John,Mike')) SELECT * FROM Numbers WHERE Numbers.NUMBER IN (SELECT numberval FROM dbo.CSVTable('1,2,34,5,5,6,7,8')) SELECT * FROM Dates WHERE Dates.DATE IN (SELECT dateval FROM dbo.CSVTable ('1/1/2000','1/2/2000','1/3/2000'))
Of course, the function works with @variables or fieldnames or any other expression:
SELECT * FROM dbo.CSVTable(@ListOfNames)
Categories: SQL