在SQL2008中使用XML应对不确定结构的参数

时间:2023-03-10 05:36:58
在SQL2008中使用XML应对不确定结构的参数

目的:统一接口,当数据结构发生变化时,前后端业务接口不发生变化,由业务具体解析结构。

规则:确定的接口用参数表(多行提交),不确定的参数用XML

 

  1.     (
  2.       HardwareNo INT ,
  3.       emvno INT ,
  4.       DATA XML
  5.     )
  6. VALUES ( 1, 1,
  7.           '<d><k>meter</k><v>1</v></d><d><k>run</k><v>100</v></d><d><k>work</k><v>80</v></d><d><k>dead</k><v>20</v></d>' ),
  8.         ( 2, 1,
  9.           '<d><k>meter</k><v>21</v></d><d><k>run</k><v>100</v></d><d><k>work</k><v>80</v></d><d><k>dead</k><v>20</v></d>' ),
  10.         ( 3, 1,
  11.           '<d><k>meter</k><v>31</v></d><d><k>run</k><v>100</v></d><d><k>work</k><v>80</v></d><d><k>dead</k><v>20</v></d><d><k>good</k><v>210</v></d>' )
  12. SELECT *
  13. FROM @r
  14. DECLARE @xml XML
  15. SELECT @xml = data
  16. FROM @r
  17. SELECT T.c.value('k[1]', 'varchar(20)') k ,
  18.         T.c.value('v[1]', 'varchar(20)') v
  19. FROM @xml.nodes('/d') T ( c )
  20. SELECT HardwareNo ,
  21.         T.c.value('k[1]', 'varchar(20)') k ,
  22.         T.c.value('v[1]', 'varchar(20)') v
  23. FROM @r
  24.         CROSS APPLY data.nodes('/d') AS T ( c )

 

输出结果:

 

  1. (3 行受影响)
  2. HardwareNo emvno DATA
  3. 1 1 <d><k>meter</k><v>1</v></d><d><k>run</k><v>100</v></d><d><k>work</k><v>80</v></d><d><k>dead</k><v>20</v></d>
  4. 2 1 <d><k>meter</k><v>21</v></d><d><k>run</k><v>100</v></d><d><k>work</k><v>80</v></d><d><k>dead</k><v>20</v></d>
  5. 3 1 <d><k>meter</k><v>31</v></d><d><k>run</k><v>100</v></d><d><k>work</k><v>80</v></d><d><k>dead</k><v>20</v></d><d><k>good</k><v>210</v></d>
  6. (3 行受影响)
  7. k v
  8. -------------------- --------------------
  9. meter 31
  10. run 100
  11. work 80
  12. dead 20
  13. good 210
  14. (5 行受影响)
  15. HardwareNo k v
  16. ----------- -------------------- --------------------
  17. 1 meter 1
  18. 1 run 100
  19. 1 work 80
  20. 1 dead 20
  21. 2 meter 21
  22. 2 run 100
  23. 2 work 80
  24. 2 dead 20
  25. 3 meter 31
  26. 3 run 100
  27. 3 work 80
  28. 3 dead 20
  29. 3 good 210
  30. (13 行受影响)