SQL Server 中对 FOR XML和FROM的转换处理

在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格式也不同,后面再转换的语句也不同,记录一下,省得忘了!!!

猜你喜欢

转载自www.cnblogs.com/focean/p/9473286.html