2017-12-13 10 views
0

これを行う方法に関する多数の記事を読んでいますが、これを動作させることはできません。私はnvarchar(max)列のテーブルを持っており、数十ページ分のテキストを含む可能性があります。私は、これを段落を分割するために、各キャリッジリターンが入力される別々の行に分割する必要があります。SQL Server 2012分割された行が別の行に分割される

私は、以下の機能が見つかりました:私は区切り文字としてスペースを使用して、簡単なダミーのテーブルの上にこれをテストしてきたし、それが動作

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)以外の異なるデリミタを使用しようとしましたが、セミコロンを期待してエラーが発生しました。

誰かが私が間違っているのを見ていますか?

+1

はあなたの実際のデータは、任意の組み込み '' <' or '>文字が含まれていますか?あるいは、さらに悪いことに、組み込みXMLのような構文(例えば、 ' ')? – Forty3

+0

入力されたテキストは、コードの一種ではなく、タイトルドキュメントに関する多くのコメントを含んでいます。私はそれらを見ることに驚かれるだろうが、いくつかの< or >文字が存在する可能性があります。 – user2638607

+0

上記のコードで使用されている特定のAssigmentID = 20のテキストがチェックされていることを確認しましたが、何もありません。 – user2638607

答えて

0

それは私の機能です:

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 
関連する問題