【问题标题】:Extract the first 6 lines from nvarchar text and the rest从 nvarchar 文本中提取前 6 行,其余部分
【发布时间】:2020-02-14 08:48:47
【问题描述】:

我需要从该文本中提取前 6 行,然后使用 select 语句提取其余行,我使用的是 SQL Server 2016。

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

SELECT '6 first lines', 'rest lines'

结果:

第 1 栏:

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

第 2 栏:

and then extract
the rest,
thanks

【问题讨论】:

  • 你尝试了什么,为什么没有成功?分隔符是 CRLF,还是只是 LF?
  • “此文本”在您的数据库中存储在何处以及如何存储?是否在每个换行符一行的表格中?它是查询窗口中的内联文本复制粘贴吗?
  • @GeorgeMenoutis 它存储在带有 char(13) 行跳转的 nvarchar 列中
  • 只是一个回车,没有换行(以及)?
  • 它必须有一个换行符。你也试过吗?

标签: sql sql-server stored-procedures substring sql-server-2016


【解决方案1】:

假设您拥有最新版本的 SQL Server,您可以使用内置函数 STRING_SPLITSTRING_AGGTABLE 变量与 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 Fiddle中工作

我不得不在小提琴中使用CHAR(10),因为那里的换行符是如何表示的。可能是由 Web 界面或 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)

【讨论】:

  • 谢谢,但是我的 SQL server 版本不支持 STRING_AGG 函数
  • 那太糟糕了。最好始终在您的问题中指定您的 SQL 版本。
【解决方案2】:

浏览 DelimitedSplit8K

这是一个表格函数,可以通过分隔符将任何字符串(在这种情况下可能是 CHR(10) 和/或 CHR(13) 拆分为带有位置编号和内容的表格。然后您可以选择两个查询的位置 6

【讨论】:

  • DelimitedSplit8K_LEAD 更好;)
猜你喜欢
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多