web-dev-qa-db-ja.com

XML配列を個別の行に分割する方法(一貫性を維持しながら)

この正確なスタック交換セクションのデータベースダンプに取り組んでいます。私がそれに取り組んでいる間、私は現在解決できない1つの問題に遭遇しました。

XMLファイルPosts.xmlの内容は次のようになります。

enter image description here

もちろん複数の行がありますが、そのように見えます。ダンプには既にTags.xmlファイルが含まれています。これにより、その画像の "Tags"属性が実際には個別のテーブル(多から多)であることが想定されていることがさらに明確になります。

だから今私はタグを抽出する方法を理解しようとしています。これが私がやろうとしたことです:

CREATE TABLE #TestingIdea (
Id int PRIMARY KEY IDENTITY (1,1),
PostId int NULL,
Tag nvarchar (MAX) NULL
)
GO

↑コードをテストするために作成したテーブル。タグとポストIDをすでに入力しました

SELECT  T1.PostId,
        S.SplitTag
FROM (
    SELECT  T.PostId, 
            cast('<X>'+ REPLACE(T.Tag,'>','</X><X>') + '</X>' as XML) AS NewTag
    FROM #TestingIdea AS T
    ) AS T1
CROSS APPLY (
    SELECT tData.value('.','nvarchar(30)') SplitTag
    FROM T1.NewTag.nodes('X') AS T(tData)
    ) AS S
GO

しかし、このコードはこのエラーを返します

XML parsing: line 1, character 37, illegal qualified name character

このエラー(ここを含む)をググった後、私が持っていなかった(余分な "マークや別のCHARセットなど)何でも持っていたので、私は一種の行き詰まりになっています。これに取り組む方法についてのヘルプとアドバイスに感謝しますこれはまだ正規化していない最後のテーブルです。

XMLファイルからの小さなサンプルデータhttps://Pastebin.com/AW0Z8Be2 私が使用するプログラムに興味がある人向けXMLファイルを表示します(上の図のように読むのがはるかに簡単です)。 FOXE XMLリーダー(無料のXMLエディター-最初のオブジェクト)と呼ばれます

6
Chessbrain

このようなものは結果セットを満たしますか?

テーブルとデータ

CREATE TABLE #TestingIdea (
Id int PRIMARY KEY IDENTITY (1,1),
PostId int NULL,
Tag nvarchar (MAX) NULL
)

INSERT INTO #TestingIdea(PostId,Tag)
VALUES(1,'<mysql><innodb><myisam>')

GO

クエリ

SELECT PostId, RIGHT(value,len(value)-1) as SplitTag
FROM #TestingIdea 
CROSS APPLY string_split(tag,'>')
WHERE value != ''

結果

PostId  SplitTag
1   mysql
1   innodb
1   myisam
8
Randi Vertongen