Если вы заранее знаете максимальное количество строк с разделителями, вы можете использовать что-то в следующих строках (он использует рекурсивный CTE для построения таблицы отдельных строк, а затем поворачивает их, получая строкудля каждого поля page_name
):
-- Table variable is just for example purposes.
DECLARE @tbl table (page_name varchar(255))
;
INSERT INTO @tbl
VALUES
('it-bae|')
, ('it-bae|content|advisor in newsletter')
, ('it-bae|content|area products|showcase products fideuram|fideuram fonditalia dynamic')
, ('it-bae|content|events|events|events|webinars|new')
;
WITH cteParts
AS
(
SELECT
page_name
, 1 single_page_no
, CASE WHEN CHARINDEX('|', page_name) = 0 THEN page_name ELSE LEFT(page_name, CHARINDEX('|', page_name) - 1) END single_page_name
, CASE WHEN CHARINDEX('|', page_name) > 0 THEN RIGHT(page_name, LEN(page_name) - CHARINDEX('|', page_name)) END remainder
, ROW_NUMBER() OVER (ORDER BY page_name) row_id
FROM @tbl
UNION ALL
SELECT
page_name
, single_page_no + 1
, CASE WHEN CHARINDEX('|', remainder) > 0 THEN LEFT(remainder, CHARINDEX('|', remainder) - 1) ELSE remainder END
, CASE WHEN CHARINDEX('|', remainder) > 0 THEN RIGHT(remainder, LEN(remainder) - CHARINDEX('|', remainder)) END
, row_id
FROM cteParts
WHERE LEN(remainder) > 0
)
SELECT
row_id
, page_name
, [1]
, [2]
, [3]
, [4]
, [5]
, [6]
, [7]
, [8]
, [9]
, [10]
FROM
(
SELECT
row_id
, page_name
, single_page_no
, single_page_name
FROM cteParts
) Q
PIVOT
(
MAX(single_page_name)
FOR single_page_no IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10])
) P
В противном случае вам потребуется использовать динамический SQL для достижения чего-то подобного.
Вот пример решения с динамическим SQL:
-- Temporary table is just for example purposes.
CREATE TABLE #tbl (page_name varchar(255))
;
INSERT INTO #tbl
VALUES
('it-bae|')
, ('it-bae|content|advisor in newsletter')
, ('it-bae|content|area products|showcase products fideuram|fideuram fonditalia dynamic')
, ('it-bae|content|events|events|events|webinars|new')
;
DECLARE @maxStrings int =
(
SELECT MAX(LEN(page_name) - LEN(REPLACE(page_name, '|', ''))) + 1
FROM #tbl
)
;
DECLARE @headers varchar(1000)
;
WITH cteHeaders
AS
(
SELECT 1 Header
UNION ALL
SELECT Header + 1
FROM cteHeaders
WHERE Header + 1 <= @maxStrings
)
SELECT DISTINCT @headers = STUFF((SELECT ', [' + CAST(Header AS varchar(3)) + ']' FROM cteHeaders FOR XML PATH('')), 1, 2, '')
FROM cteHeaders
;
DECLARE @sql varchar(8000) =
'
WITH cteParts
AS
(
SELECT
page_name
, 1 single_page_no
, CASE WHEN CHARINDEX(''|'', page_name) = 0 THEN page_name ELSE LEFT(page_name, CHARINDEX(''|'', page_name) - 1) END single_page_name
, CASE WHEN CHARINDEX(''|'', page_name) > 0 THEN RIGHT(page_name, LEN(page_name) - CHARINDEX(''|'', page_name)) END remainder
, ROW_NUMBER() OVER (ORDER BY page_name) row_id
FROM #tbl
UNION ALL
SELECT
page_name
, single_page_no + 1
, CASE WHEN CHARINDEX(''|'', remainder) > 0 THEN LEFT(remainder, CHARINDEX(''|'', remainder) - 1) ELSE remainder END
, CASE WHEN CHARINDEX(''|'', remainder) > 0 THEN RIGHT(remainder, LEN(remainder) - CHARINDEX(''|'', remainder)) END
, row_id
FROM cteParts
WHERE LEN(remainder) > 0
)
SELECT
row_id
, page_name
, ' + @headers + '
FROM
(
SELECT
row_id
, page_name
, single_page_no
, single_page_name
FROM cteParts
) Q
PIVOT
(
MAX(single_page_name)
FOR single_page_no IN (' + @headers + ')
) P
'
EXEC (@sql)
DROP TABLE #tbl