如何在SQL中从XML中选择值

时间:2011-11-18 15:29:08

标签: sql xml sql-server-2008

我试图从SQL中的某些XML获取值但是在最后一部分中挣扎,我如何从中获取值?

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,Ideall我希望结果看起来像:

Drive | Space
    C:\  123456

之前可能已经提出过这个问题,但是我看不到有人回答如何做到这一点(关于如何从表中获取XML的大量数据,关于如何从XML中将数据导入表中的数据)以及我的经验区域有点缺乏所以我坚持如何完成这个。

由于

2 个答案:

答案 0 :(得分:4)

只是简单地查询它。

select
  t.drivedata.value('DriveName[1]', 'varchar(max)'),
  t.drivedata.value('DriveSpace[1]', 'bigint')
from
  @info.nodes('/ArrayOfDriveData/DriveData') as t(drivedata);

答案 1 :(得分:3)

如果你想坚持使用openxml

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

当然,这会将DriveSpace放入varchar,但您可以将其更改为您需要的任何数据类型。

我还想指出,GSerg下面发布的内容通常被认为是最近这样做的正确方法。 OPENXML是一种较老的方法。