Hasznos funkció: fnSplit

Sajnos nem minden cég használ legfrissebb verziót egy-egy programból, vagy csak simán egy másik rendszerből érkező adatok nem tudnak olyan funkciókat, amit pl. az SQL Server tud. Ilyen például a TVP – Table Value Parameter.

Képzeljük el az az esetet, amikor TVP helyett egy listát kapunk, pl: a,b,c,d. Ahhoz, hogy ezt tábla formában kapjuk meg, az alábbi megoldást szoktam alkalmazni:

 1USE tempdb;
 2GO
 3 
 4CREATE FUNCTION [dbo].[fnSplit]
 5(
 6    @text nvarchar(max),
 7    @separator char(1) = ','
 8)
 9RETURNS @result TABLE
10(
11    item nvarchar(max)
12)
13AS
14BEGIN
15    DECLARE @i int, @j int;
16    SET @i = LEN(@text);
17    SET @j = 1;
18     
19    WHILE @j > -1
20        BEGIN
21            SET @j = CHARINDEX(@separator, @text);
22            IF @j = 0
23                BEGIN
24                    INSERT INTO @result VALUES (@text);
25                    BREAK;
26                END
27            SET @i = @i - @j;
28            INSERT INTO @result VALUES (SUBSTRING(@text, 0, @j));
29            SET @text = RIGHT(@text, @i);
30        END
31    RETURN;
32END
33GO
34 
35DECLARE @text nvarchar(max)= 'a,b,c,d';
36SELECT * FROM [dbo].[fnSplit](@text, DEFAULT);
37 
38/*
39item
40a
41b
42c
43d
44 
45(4 row(s) affected)
46*/