【问题标题】:SQL Server 2012 split nvarchar(max) carriage returns into separate rowsSQL Server 2012 拆分 nvarchar(max) 回车到单独的行
【发布时间】:2017-12-13 19:27:38
【问题描述】:

我已经阅读了很多关于如何做到这一点的帖子,但我无法让它发挥作用。我有一个带有nvarchar(max) 列的表,其中可能包含数十页的文本。我需要将其拆分为单独的行,在其中输入每个回车符(以拆分段落)。

我找到了以下函数:

CREATE FUNCTION [dbo].[udf-Str-Parse] 
    (@String varchar(max), @Delimiter varchar(10))
Returns Table 
As
    Return 
        (Select 
             RetSeq = Row_Number() over (Order By (Select null)),
             RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
         From 
             (Select x = Cast('<x>'+ Replace(@String, @Delimiter, '</x><x>') + '</x>' as xml).query('.')) as A 
         Cross Apply 
             x.nodes('x') AS B(i)
);

我已经在一个使用空格作为分隔符的简单虚拟表上对此进行了测试,并且它可以工作,但是当我使用以下代码查询在带有文本的实际表上尝试此操作时;

Select 
    A.AssignmentID, Notes = B.RetVal
From  
    dbo.Assignments A
Cross Apply 
    [dbo].[udf-Str-Parse](A.TitleNotes, char(13)) B
Where 
    AssignmentID = 20

我收到以下消息:

消息 9411,第 16 层,状态 1,第 1 行
XML 解析:第 2 行,字符 127,需要分号

我尝试过使用除char(13) 以外的不同分隔符,包括像我的简单表格示例那样的空格,但我只是得到了需要分号的错误。

有人看到我做错了吗?

【问题讨论】:

  • 您的实际数据是否包含任何嵌入的&lt;&gt; 字符?或者,更糟糕的是,任何嵌入的类似 XML 的语法(例如 &lt;something&gt;)?
  • 输入的文本不会是任何类型的代码,并且包含很多关于产权文件的 cmets。可能会有一些 字符,但我会很惊讶地看到它们。
  • 我检查了上面代码中使用的特定 AssigmentID=20 中的文本,但没有。
  • 我遇到了这个 SO 答案XML Semicolon needed,这可能会有所启发。 tl;博士; - 检查以确保您的文本不包含&符号。
  • 太棒了,我更改了我的 select 语句以包含一个替换函数来将 '&' 更改为 '&'它工作得很好。我想我还需要确保 如果输入它们会被替换。非常感谢。

标签: sql-server split


【解决方案1】:

这是我的职责:

CREATE FUNCTION [dbo].[FN_SPLIT](@Long_str varchar(max),@split_str varchar(100))    
RETURNS  @tmp TABLE(        
    ID      inT IDENTITY PRIMARY KEY,      
    SPLIT   varchar(max)    
)    
AS   
BEGIN 
    DECLARE @sxml XML


    SET @sxml='<r><n>'+REPLACE(@Long_str,@split_str,'</n><n>')+'</n></r>'
        INSERT INTO @tmp([SPLIT])
        SELECT b.value('.','varchar(max)') FROM @sxml.nodes('r/n') AS s(b)
    RETURN     
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多