-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuncParseDelimitedString.sql
69 lines (67 loc) · 1.62 KB
/
funcParseDelimitedString.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
IF OBJECT_ID('[dbo].[funcParseDelimitedString]', 'TF') IS NOT NULL
DROP FUNCTION [dbo].[funcParseDelimitedString]
GO
CREATE FUNCTION [dbo].[funcParseDelimitedString]( @delimitedString NVARCHAR(MAX), @delimiter varchar(5) = ',')
RETURNS @values TABLE(
idx int NOT NULL IDENTITY(1,1) PRIMARY KEY,
value varchar(max)
)
AS
BEGIN
WITH params AS(
-- load parameters to table
SELECT
'string' as which,
'~' + @delimitedString + '~' as val
UNION SELECT
'delimiter' as which,
'~' + @delimiter + '~' as val
)
, encode AS(
-- encode to XML (to handle special characters)
SELECT
which,
(SELECT TRIM(val) FOR XML PATH('')) val
FROM params
)
, strip AS(
-- Take the qualifiers (added in first query) off the values
SELECT
which,
SUBSTRING(val, 2, LEN(val)-2) val
FROM encode
)
, xmlString AS(
-- Split text into XML nodes
SELECT
'<val>' + REPLACE(string, delimiter, '</val><val>') + '</val>' as xmlInput,
(SELECT ' ' FOR XML PATH('')) as xmlSpace
FROM strip e
PIVOT (MAX(val)
FOR which IN(string, delimiter)) pvt
)
, toXml AS(
-- Convert to actual XML
SELECT
xmlVal = CAST(REPLACE(xmlInput, ' ', xmlSpace) as xml)
FROM xmlString
)
, vals AS(
-- Parse XML nodes to individual values
SELECT
s.val.value('.','nvarchar(max)') val,
s.val.value('string-length(.)','int') size
FROM toXml
CROSS APPLY xmlVal.nodes('/val')s(val)
)
-- Populate results, including empty spaces
INSERT INTO @values
SELECT
CASE WHEN val = '' AND size > 0
THEN REPLICATE(' ', size)
ELSE val
END
FROM vals
RETURN
END
GO