Как выбрать значения из XML в SQL - PullRequest
2 голосов
/ 18 ноября 2011

Я пытаюсь получить значения из некоторого XML в SQL, но борюсь с последней частью, как я могу получить значения из этого?

DECLARE @Info XML
SET @Info=N'<?xml version="1.0" encoding="utf-16"?>
<ArrayOfDriveData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DriveData>
    <DriveName>C:\</DriveName>
    <DriveSpace>429223288832</DriveSpace>
  </DriveData>
  <DriveData>
    <DriveName>I:\</DriveName>
    <DriveSpace>228759863296</DriveSpace>
  </DriveData>
</ArrayOfDriveData>'


-- Declare a handle for the xml document    
DECLARE @idoc INT

-- Prepare the xml 
EXEC sp_xml_preparedocument @idoc OUTPUT, @Info

SELECT 
    *
FROM 
    OPENXML (@idoc, '/ArrayOfDriveData/DriveData/,3)

Результаты, которые я получаю:

id | parentid | nodetype | localname| namespaceuri | datatype | prev | text
4   0   1   DriveData   NULL    NULL    NULL    NULL    NULL
5   4   1   DriveName   NULL    NULL    NULL    NULL    NULL
10  5   3   #text   NULL    NULL    NULL    NULL    C:\
6   4   1   DriveSpace  NULL    NULL    NULL    5   NULL
11  6   3   #text   NULL    NULL    NULL    NULL    429223288832
7   0   1   DriveData   NULL    NULL    NULL    4   NULL
8   7   1   DriveName   NULL    NULL    NULL    NULL    NULL
12  8   3   #text   NULL    NULL    NULL    NULL    I:\
9   7   1   DriveSpace  NULL    NULL    NULL    8   NULL
13  9   3   #text   NULL    NULL    NULL    NULL    228759863296

Кажется, единственные столбцы, которые мне нужны, это localname и Text, в идеале я бы хотел, чтобы результат выглядел следующим образом:

Drive | Space
    C:\  123456

Вероятно, об этом спрашивали раньше, но я не мог видеть, чтобы кто-нибудь отвечал, как это сделать.это (много данных о том, как получить XML из таблицы, не так много о том, как получить данные в таблицу из XML), и моего опыта в этой области немного не хватает, поэтому я застрял на том, как закончить это.

Спасибо

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

Просто запросите его.

select
  t.drivedata.value('DriveName[1]', 'varchar(max)'),
  t.drivedata.value('DriveSpace[1]', 'bigint')
from
  @info.nodes('/ArrayOfDriveData/DriveData') as t(drivedata);
3 голосов
/ 18 ноября 2011

Если вы хотите придерживаться openxml, его

SELECT 
    DriveName, DriveSpace
FROM 
    OPENXML (@idoc, '/ArrayOfDriveData/DriveData',3)
    with (DriveName varchar(10) 'DriveName', DriveSpace varchar(20) 'DriveSpace)

Это, конечно, помещает DriveSpace в varchar, но вы можете изменить его на тот тип данных, который вам необходим.

Я также хочу отметить, что то, что GSerg опубликовал ниже, обычно считается более правильным способом сделать это в наши дни.OPENXML - более старый метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...