Проблема XML в SQL - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь разобрать образец xml, но я не получаю ожидаемый вывод, я использую openxml для этого:

Это код:

    declare @myxml xml =
'<Departments>
   <Department>
    <Employees>
      <Employee user="J" id="J10" method="email" date="06/13/2018 08:59">

      </Employee>
      <Employee user="R" id="R10" method="email1" date="07/13/2018 08:59">

      </Employee>
    </Employees>
  </Department>

  <Department>
    <Employees>
      <Employee user="Jason" id="J101" method="email" date="06/13/2018 08:59">

      </Employee>
      <Employee user="Roy" id="R101" method="email1" date="07/13/2018 08:59">

      </Employee>
    </Employees>
  </Department>
</Departments>'
declare @i int =2;
declare @x_path varchar(5000) = (select  'Departments/Department[' + cast(@i as varchar) + ']' )
DECLARE @hDoc AS INT, @SQL NVARCHAR (MAX)
EXEC sp_xml_preparedocument @hDoc OUTPUT, @myxml
SELECT name,id,method,user_date
FROM OPENXML(@hDoc, @x_path)
WITH 
(
name [varchar](1000) 'Employees/Employee/@user',
id [varchar](1000) 'Employees/Employee/@id',
method [varchar](1000) 'Employees/Employee/@method',
user_date [varchar](1000) 'Employee/Employee/@date'
)
EXEC sp_xml_removedocument @hDoc
go

Я получаю только 1 строку, но я хочу 2 строки:

Вывод вышеуказанного запроса:

name    id  method  user_date
Jason   J101    email   NULL

Ожидаемый результат:

name    id     method   user_date
Jason   J101    email   06/13/2018 08:59
Roy     R101    email   07/13/2018 08:59

Примечание

Я хочу выполнять итерации только через второй отдел, поэтому я добавил [@i] в путь, чтобы убедиться, что он повторяется только для 2-го отдела. и значение i будет определяться динамически, на данный момент я установил его равным 2.

Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Еще один способ:

declare @i int = 2

SELECT  t.c.value('@user', 'nvarchar(10)') as [user],
        t.c.value('@id', 'nvarchar(10)') as id,
        t.c.value('@method', 'nvarchar(10)') as method,
        t.c.value('@date', 'nvarchar(10)') as [date]
FROM @myxml.nodes('/Departments/Department/Employees/Employee') as t(c)
WHERE t.c.value('for $i in . return count(/Departments/Department[. << $i]) ', 'int') = @i

Выход:

user       id         method     date
---------- ---------- ---------- ----------
Jason      J101       email      06/13/2018
Roy        R101       email1     07/13/2018

(2 rows affected)
0 голосов
/ 03 июля 2018

Используйте этот XPath

declare @x_path varchar(5000) = (select 'Departments/Department[' + cast(@i as varchar) + ']/Employees/Employee' )

А это выбор оператора

SELECT *
FROM OPENXML(@hDoc, @x_path)
WITH 
(
name [varchar](1000) '@user',
id [varchar](1000) '@id',
method [varchar](1000) '@method',
user_date [varchar](1000) '@date'
)

Когда id = 2

это вернет

+------+------+--------+------------------+
| name |  id  | method |    user_date     |
+------+------+--------+------------------+
| Json | J101 | email  | 06/13/2018 08:59 |
| Roy  | R101 | email1 | 07/13/2018 08:59 |
+------+------+--------+------------------+

для id = 1

+------+-----+--------+------------------+
| name | id  | method |    user_date     |
+------+-----+--------+------------------+
| J    | J10 | email  | 06/13/2018 08:59 |
| R    | R10 | email1 | 07/13/2018 08:59 |
+------+-----+--------+------------------+
...