Извлеките первые 6 строк из текста nvarchar, а остальные - PullRequest
0 голосов
/ 17 октября 2019

Мне нужно извлечь первые 6 строк из этого текста, а затем остальные с выбранным утверждением, я использую SQL Server 2016.

Hi,
this is an
example
text to
extract the
first 6 lines
and then extract 
the rest,
thanks

ВЫБРАТЬ «6 первых строк», «остальные строки»

Результат:

КОЛОННА 1:

Hi,
this is an
example
text to
extract the
first 6 lines

Столбец 2:

and then extract
the rest,
thanks

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Если у вас установлена ​​последняя версия SQL Server, вы можете использовать встроенные функции STRING_SPLIT и STRING_AGG. Переменная TABLE используется со столбцом INT IDENTITY(1,1) для отслеживания номеров строк.

Код SQL:

CREATE TABLE Report (id INT, LongText NVARCHAR(MAX))
GO

INSERT INTO Report VALUES (37, 'Hi,
this is an
example
text to
extract the
first 6 lines
and then extract 
the rest,
thanks
')
GO

DECLARE @Splitted TABLE(id INT IDENTITY(1,1), value NVARCHAR(MAX))
INSERT INTO @Splitted
       SELECT value FROM STRING_SPLIT( (SELECT TOP 1 LongText FROM Report WHERE id=37), CHAR(13) )

SELECT (SELECT STRING_AGG(value, CHAR(13)) FROM @Splitted WHERE id <= 6) AS Column_1,
       (SELECT STRING_AGG(value, CHAR(13)) FROM @Splitted WHERE id  > 6) AS Column_2

GO
DROP TABLE Report

Вы можете видеть, что он работает в SQLСкрипка

Мне пришлось использовать CHAR(10) в скрипке из-за того, как там представлены разрывы строк. Предположительно, вызвано веб-интерфейсом или хостингом Linux.


Вы также можете создать для нее Пользовательскую функцию :

CREATE OR ALTER FUNCTION SplitAsColumns(@LongText NVARCHAR(MAX), @LineCount INT)
RETURNS @TABLE TABLE(Column_1 NVARCHAR(MAX), Column_2 NVARCHAR(MAX))
AS
BEGIN
    DECLARE @Splitted TABLE(id INT IDENTITY(1,1), value NVARCHAR(MAX))
    INSERT INTO @Splitted SELECT value FROM STRING_SPLIT( @LongText, CHAR(13) )
    INSERT @TABLE
        SELECT (SELECT STRING_AGG(value, CHAR(13)) FROM @Splitted WHERE id <= @LineCount) AS Column_1,
               (SELECT STRING_AGG(value, CHAR(13)) FROM @Splitted WHERE id  > @LineCount) AS Column_2
    RETURN
END
GO

SELECT * FROM SplitAsColumns('Hi,
this is an
example
text to
extract the
first 6 lines
and then extract 
the rest,
thanks
', 6)
0 голосов
/ 17 октября 2019

browse for DelimitedSplit8K

Это табличная функция, которая может разбить любую строку по ее разделителю (в данном случае это, вероятно, CHR (10) и / или CHR (13) в таблицу с позициейномер и содержимое. Затем вы можете выбрать позицию <= 6 или> 6 для двух запросов

...