挑战 - 将XML处理成T-SQL表结构?

Mat*_*t W 2 xml t-sql

如果你有这个XML:

<people>
  <person id="1">
    <firstname>John</firstname>
    <surname>Doe</surname>
  </person>
  <person id="2">
    <firstname>Mary</firstname>
    <surname>Jane</surname>
  </person>
</people>
Run Code Online (Sandbox Code Playgroud)

你想要这张桌子:

id  firstname  surname
--- ---------- ----------
1   John       Doe
2   Mary       Jane
Run Code Online (Sandbox Code Playgroud)

你会如何使用T-SQLXML获得它?

并抛出一个扳手到组合:比方说,你知道的深度<person>,<firstname><surname>元素,但你不知道他们叫什么!

如果你觉得这个更好贴到reddit,请随意火焰:)

mar*_*c_s 5

我建议使用XQuery接口,而不是相当笨重的旧OPENXML方法:

SELECT
    Ppl.Person.value('(@id)[1]', 'int') AS 'ID',
    Ppl.Person.value('(firstname)[1]', 'varchar(20)') AS 'First Name',
    Ppl.Person.value('(surname)[1]', 'varchar(20)') AS 'Last Name'
FROM
    @input.nodes('/people/person') as Ppl(Person)
Run Code Online (Sandbox Code Playgroud)

这是在SQL Server 2005和转发中执行此操作的首选方法.

输出是一样的:

ID  First Name  Last Name
1    John             Doe
2    Mary             Jane
Run Code Online (Sandbox Code Playgroud)

但是,如果您不了解XML结构,则无法真正做到这一点.....

  • 我发现使用带有SELECT/INTO的XQUERY转储到临时表中然后使用INSERT/INTO从临时表到生产表会快得多. (2认同)