Чтение данных XML с SQL Server со значениями Hear и Node - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующие данные XML в файле "Test1.xml":

<TextValuess>
 <TextValues Name="Value1" Override="true" Type="String">
  <DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
  <INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
  <INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
  <INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
 </TextValues>
 <TextValues Name="ENVIRONMENT" Override="true" Type="String">
  <DEV>DEV</DEV>
  <INT10>INT10</INT10>
  <INT>INT1</INT>
  <INT2>INT15</INT2>
 </TextValues>
</TextValuess>

Я пытаюсь прочитать значения INT10 и имя тега <TextValues>.Мне нужен вывод, как показано ниже в SQL Server:

Name               Value
----               -----
Value1             LAB
Environment        INT10

Я пытался с этими операторами SQL.Я смог получить либо значение Name, либо значения INT10.

Заявление 1:

select c3.value('INT10[1]','varchar(50)')
from
    (select cast(c1 as xml)
     from OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) as T1(c1)) as T2(c2)
cross apply c2.nodes('/TextValuess/TextValues') T3(c3)

Благодаря этому я смог получить значения для INT10

Заявление 2:

 DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

 SELECT @XML = ' <TextValuess>
 <TextValues Name="Value1" Override="true" Type="String">
  <DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
  <INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
  <INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
  <INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
 </TextValues>
 <TextValues Name="ENVIRONMENT" Override="true" Type="String">
  <DEV>DEV</DEV>
  <INT10>INT10</INT10>
  <INT>INT1</INT>
  <INT2>INT15</INT2>
 </TextValues>
</TextValuess>'

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT Name ,INT10
FROM OPENXML(@hDoc, 'TextValuess/TextValues/INT10')
WITH 
(
Name [varchar](50) '../@Name',
INT10 [varchar](100) '../@INT10'
)

Благодаря этому я смог получить только информацию об имени, но не значение INT10.

1 Ответ

0 голосов
/ 19 декабря 2018

Попробуйте этот код:

-- declare a XML variable
DECLARE @XmlInput XML;

-- load the XML from the file into that XML variable
SELECT @XmlInput = CAST(c1 AS XML)
FROM OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) AS T1(c1)

-- extract the "Name" attribute and "INT10" element from the XML    
SELECT
    Name = XC.value('@Name', 'varchar(50)'),
    Int10Value = XC.value('(INT10)[1]', 'varchar(100)')
FROM    
    @XmlData.nodes('/TextValuess/TextValues') AS XT(XC)

Вызов .nodes() с использованием встроенной, очень предпочтительной функциональности XQuery (выгрузите материал OPENXML - он старый и старый и имеет утечки памяти - XQueryтакже намного проще в использовании!) возвращает список фрагментов XML - по одному для каждого совпадения выражения XPath в вашем документе (здесь: по одному для каждого <TextValues> узла под корнем).

Затем выдобраться до этого фрагмента XML и извлечь имя атрибут (используя выражение @Name) и первый (и единственный) подэлемент <INT10> и преобразовать их в "обычные" значения (стип данных, определенный вторым параметром вызова .value())

...