【发布时间】: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) 以外的不同分隔符,包括像我的简单表格示例那样的空格,但我只是得到了需要分号的错误。
有人看到我做错了吗?
【问题讨论】:
-
您的实际数据是否包含任何嵌入的
<或>字符?或者,更糟糕的是,任何嵌入的类似 XML 的语法(例如<something>)? -
输入的文本不会是任何类型的代码,并且包含很多关于产权文件的 cmets。可能会有一些 字符,但我会很惊讶地看到它们。
-
我检查了上面代码中使用的特定 AssigmentID=20 中的文本,但没有。
-
我遇到了这个 SO 答案XML Semicolon needed,这可能会有所启发。 tl;博士; - 检查以确保您的文本不包含&符号。
-
太棒了,我更改了我的 select 语句以包含一个替换函数来将 '&' 更改为 '&'它工作得很好。我想我还需要确保 如果输入它们会被替换。非常感谢。
标签: sql-server split