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

时间:2010-07-06 16:29:48

标签: xml tsql

如果你有这个XML:

<people>
  <person id="1">
    <firstname>John</firstname>
    <surname>Doe</surname>
  </person>
  <person id="2">
    <firstname>Mary</firstname>
    <surname>Jane</surname>
  </person>
</people>

你想要这张桌子:

id  firstname  surname
--- ---------- ----------
1   John       Doe
2   Mary       Jane

如何使用T-SQLXML获得它?

让扳手投入混音:让我们说你知道<person><firstname><surname>元素的深度,但是你不知道他们叫什么!

如果您认为最好将其发布到reddit,请随意加火:)

2 个答案:

答案 0 :(得分: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)

这是在SQL Server 2005中转发的首选方法。

输出相同:

ID  First Name  Last Name
1    John             Doe
2    Mary             Jane

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

答案 1 :(得分:3)

这将使你获得表格。如果您不知道XML列名,那么您可能必须使用动态SQL(例如,对于“firstname varchar(20)'firstname'”,您必须将“firstname”替换为XML列名称。 ,我假设您将在运行时确定):

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<people>
  <person id="1">
    <firstname>John</firstname>
    <surname>Doe</surname>
  </person>
  <person id="2">
    <firstname>Mary</firstname>
    <surname>Jane</surname>
  </person>
</people>
'
/* Create an internal representation of the XML document */
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT    *
FROM       OPENXML (@idoc, '/people/person',1)
            WITH (id varchar(20),
                  firstname varchar(20) 'firstname',
                  surname varchar(20) 'surname')
EXECUTE sp_xml_removedocument @idoc

结果:

id  firstname       surname
1   John            Doe
2   Mary            Jane