Задача - Обработка XML в структуру таблицы T-SQL? - PullRequest
2 голосов
/ 06 июля 2010

Если у вас есть этот 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 ]

5 голосов
/ 06 июля 2010

Я бы рекомендовал использовать интерфейс 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 .....

3 голосов
/ 06 июля 2010

Это даст вам стол. Если вы не знаете имен столбцов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...