Sql-Server
如何將 XML 數組拆分為單獨的行(同時保持一致性)
我正在處理這個確切的堆棧交換部分的數據庫轉儲。在我處理它時,我遇到了一個我目前無法解決的問題。
在 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