T- SQL: горячая, чтобы просмотреть результат из CTE и разделить любое значение длиннее заданной длины, добавив строку рядом с исходной строкой? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть функция, которая использует 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),'&','&amp;'),@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.

...