У меня есть функция, которая использует CTE, который принимает строку, разделенную разделителем, в моем случае строку, разделенную пробелом, и разбивает ее на набор результатов таблицы. затем возвращает его обратно вызывающей стороне.
DECLARE @WorkingCopy VARCHAR(MAX) = 'The,quick,brown,fox,jumps,over,the,lazy,dog. The quick brown'
,@NColSize INT = 35
,@Delimiter VARCHAR(1) = ' '
SET @WorkingCopy = CONCAT(@WorkingCopy,@Delimiter) ---- add delimter to the end as we need to fully process the string
---- Split incomming string by delim into temp table
DECLARE @W_xml XML;
SET @W_xml = N'<root><i>' + replace(replace(REPLACE(@WorkingCopy,@Delimiter+@Delimiter,@Delimiter),'&','&'),@Delimiter,CONCAT('</i><i>',@Delimiter,'</i><i>')) + '</i></root>';
;WITH StrSplit
AS (SELECT ROW_NUMBER() OVER( ORDER BY [i]) AS RowNum
,ISNULL(NULLIF([i].value ('.','VARCHAR(MAX)' ),''),' ') AS [split]
,DATALENGTH(ISNULL(NULLIF([i].value ('.','VARCHAR(MAX)' ),''),' ')) AS [DataLen]
FROM @W_xml.nodes
('//root/i' ) AS [Items]([i])
)
select * from StrSplit
результат выглядит как таблица:
RowNum | split | DataLen |
---------------------------------------------------------------------
1 | The,quick,brown,fox,jumps,over,the,lazy,dog. | 44 |
2 | | 1 |
3 | The | 3 |
4 | | 1 |
5 | quick | 5 |
6 | | 1 |
7 | brown | 5 |
8 | | 1 |
9 | | 1 |
вот моя проблема, мне нужно убедиться, что каждое значение в столбце разбиения не длиннее указанной длины, переданной как параметр в функции, скажем, длина составляет 35 символов. Как вы видите, первая строка нарушает это правило.
как я могу просмотреть набор результатов и дополнительно разбить значения, более длинные, чем хотелось бы, на дополнительные строки
, как показано ниже, см. строку 2 , сохраняя порядок. это вставка новой строки сразу после ошибочного значения и перенумерация индекса
RowNum | split | DataLen |
_____________________________________________________________________
1 |The,quick,brown,fox,jumps | 35 |
2 |,over,the,lazy,dog. | 29 |
3 | | 1 |
4 |The | 3 |
5 | | 1 |
6 |quick | 5 |
7 | | 1 |
8 |brown | 5 |
9 | | 1 |
10 | | 1 |
Мне нужно это, потому что у меня есть другая обработка CTE после того, как это форматирование результата вывода, я просто хочу вставить дополнительный CTE между ними.
До сих пор я не нашел решение самостоятельно, поэтому вот я: -)
заранее спасибо. VL.