Если у вас установлена последняя версия 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)