我试图从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中将数据导入表中的数据)以及我的经验区域有点缺乏所以我坚持如何完成这个。
由于
答案 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是一种较老的方法。