Sql-Server

更新格式錯誤的 XML 以允許解析

  • December 17, 2018

我繼承了一個生產系統,需要進行一些微調才能輕鬆提取結果集。一條記錄被添加到包含 XML 欄位的表中,其內容類似於以下內容:

<PROG>PROGX_</PROG><STNTYPE>LEAKTEST</STNTYPE><STNID>S1</STNID><TRCODE>SN_REQUEST</TRCODE><OPERATORID>222</OPERATORID><PARTID>PARTID</PARTID><TRSTATUS>0000</TRSTATUS><TRTEXT>TEST OK</TRTEXT><T1_USL>0.45</T1_USL><T1_LSL>-0.45</T1_LSL><T1_RESULT>05,CC/M</T1_RESULT><T1_STATUS>OK</T1_STATUS><OVERALL_RESULT>1</OVERALL_RESULT><OVERALL_STATUS>OK</OVERALL_STATUS>

但是,我相信 XML 的格式是無效的,我希望能夠通過添加根和更好地分組來清理它。類似於以下內容:

<RESULTSET>
   <PROG>PROGX_</PROG>
   <STNTYPE>LEAKTEST</STNTYPE>
   <STNID>S1</STNID>
   ...etc...
   <OVERALL_STATUS>OK</OVERALL_STATUS>
</RESULTSET>

(當時的想法是我可以使用 SQL 視圖來正確拆分它)。

如果可能的話,有什麼想法嗎?我是 SQL 上的 XML 新手。

您無需添加根元素即可在 SQL Server 上獲取此資訊:

create table tbl (foo xml);

insert into tbl values ('<PROG>PROGX_</PROG><STNTYPE>LEAKTEST</STNTYPE><STNID>S1</STNID><TRCODE>SN_REQUEST</TRCODE><OPERATORID>222</OPERATORID><PARTID>PARTID</PARTID><TRSTATUS>0000</TRSTATUS><TRTEXT>TEST OK</TRTEXT><T1_USL>0.45</T1_USL><T1_LSL>-0.45</T1_LSL><T1_RESULT>05,CC/M</T1_RESULT><T1_STATUS>OK</T1_STATUS><OVERALL_RESULT>1</OVERALL_RESULT><OVERALL_STATUS>OK</OVERALL_STATUS>
');
select 
   foo.value('(/PROG)[1]', 'nvarchar(100)') PROG,
   foo.value('(/STNTYPE)[1]', 'nvarchar(100)') STNTYPE,
   foo.value('(/STNID)[1]', 'nvarchar(100)') STNID
from   tbl;
GO
程序 | STN 類型 | STNID
:----- | :------- | :----
PROGX_ | 洩漏測試 | S1 

db<>在這裡擺弄

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