Sql-Server

如何將 XML 數組拆分為單獨的行(同時保持一致性)

  • January 30, 2019

我正在處理這個確切的堆棧交換部分的數據庫轉儲。在我處理它時,我遇到了一個我目前無法解決的問題。

在 XML 文件 Posts.xml 中,內容如下所示

在此處輸入圖像描述

當然有多行,但這就是一個看起來的樣子。轉儲中已經給出了一個 Tags.xml 文件,這使得該圖片中的“Tags”屬性實際上應該是其單獨的表(多對多)更加明顯。

所以現在我正試圖找出一種如何提取標籤的方法。這是我試圖做的:

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

↑ 我為測試我的程式碼而創建的表。我已經用標籤和 PostIds 填充了它

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

在Google搜尋這個錯誤(包括這裡)之後,無論人們有什麼(比如額外的 " 標記或不同的 CHAR 集)我都沒有。所以我有點卡住了。也許我錯過了從以前的答案中非常明顯的東西我發現 T_T 無論如何感謝任何有關如何解決此問題的幫助和建議。這是我尚未標準化的最後一張表。

XML 文件中的小樣本數據 https://pastebin.com/AW0Z8Be2 對於任何對我用來查看 XML 文件的程序感興趣的人(所以它更容易閱讀,如上圖所示)。它被稱為 FOXE XML Reader(免費 XML 編輯器 - 第一個對象)

這樣的事情是否滿足結果集?

表格和數據

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

引用自:https://dba.stackexchange.com/questions/225067