在SQL Server中對XML的再操作轉換:
方法1:
--生成XML SELECT * FROM [T_BAS_預算科目] FOR XML PATH --把XML轉成SQL表 declare @XmlData nvarchar(max) set @XmlData = '<row 科目編碼="0" 科目名稱="全部" /> <row 科目編碼="1" 上級編碼="0" 科目名稱="功能收入分類" 科目級次="0" 預算年度="2016" 顯示級別="0" /> <row 科目編碼="101" 上級編碼="1" 科目名稱="稅收收入" 科目級次="1" 預算年度="2016" 顯示級別="0" /> <row 科目編碼="10101" 上級編碼="101" 科目名稱="增值稅" 科目級次="1" 預算年度="2016" 顯示級別="1" /> <row 科目編碼="1010101" 上級編碼="10101" 科目名稱="國內增值稅" 科目級次="1" 預算年度="2016" 顯示級別="2" /> <row 科目編碼="101010101" 上級編碼="1010101" 科目名稱="國有企業增值稅" 科目級次="1" 預算年度="2016" 顯示級別="3" /> <row 科目編碼="101010102" 上級編碼="1010101" 科目名稱="集體企業增值稅" 科目級次="1" 預算年度="2016" 顯示級別="3" /> <row 科目編碼="101010103" 上級編碼="1010101" 科目名稱="股份制企業增值稅" 科目級次="1" 預算年度="2016" 顯示級別="3" />' declare @MxDataList xml set @MxDataList = cast(@XmlData as xml) SELECT C.value('./@科目編碼','varchar(30)') as 科目編碼, C.value('./@上級編碼','varchar(30)') as 上級編碼, C.value('./@科目名稱','varchar(30)') as 科目名稱, C.value('./@科目級次','varchar(30)') as 科目級次 FROM @MxDataList.nodes('/row') T(C)
方法2:
--生成XML SELECT * FROM [T_BAS_預算科目] FOR XML RAW --把XML轉成SQL表 declare @XmlData nvarchar(max) set @XmlData = '<row> <科目編碼>0</科目編碼> <科目名稱>全部</科目名稱> </row> <row> <科目編碼>1</科目編碼> <上級編碼>0</上級編碼> <科目名稱>功能收入分類</科目名稱> <科目級次>0</科目級次> <預算年度>2016</預算年度> <顯示級別>0</顯示級別> </row> <row> <科目編碼>101</科目編碼> <上級編碼>1</上級編碼> <科目名稱>稅收收入</科目名稱> <科目級次>1</科目級次> <預算年度>2016</預算年度> <顯示級別>0</顯示級別> </row>' declare @MxDataList xml set @MxDataList = cast(@XmlData as xml) SELECT C.value('(*)[1]','varchar(30)') as 科目編碼, C.value('(*)[2]','varchar(30)') as 上級編碼, C.value('(*)[3]','varchar(30)') as 科目名稱, C.value('(*)[4]','varchar(30)') as 科目級次 FROM @MxDataList.nodes('/row') T(C)
以上兩種方法,隨着 FOR XML后面的參數不同,生成的XML格式也不同,后面再轉換的語句也不同,記錄一下,省得忘了!!!