首页 > 解决方案 > 如何在 SQL Server 中从没有标签的 xml 文件中读取 xml 数据?

问题描述

我知道如何从标签中组织信息的文件中读取 xml 数据,我的意思是这样的文件:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <Administrador>
        <id> 8 </id>
        <nombre> Nelle </nombre>
        <valorDocId> 8399335355 </valorDocId>
        <contrasenna> Glenn </contrasenna>
    </Administrador>
    <Administrador>
        <id> 9 </id>
        <nombre> Gayler </nombre>
        <valorDocId> 1310348693 </valorDocId>
        <contrasenna> Madonna </contrasenna>
    </Administrador>
</dataset>

我用来阅读的代码是:

use Proyecto1

declare @filedata XML

select @filedata=BulkColumn from OpenRowSet(Bulk'File directory', Single_blob) x;
insert into Table(id, nombre, valorDocId, clave)
select 
    xData.value('id[1]', 'int') id,
    xData.value('nombre[1]','varchar(30)') nombre,
    xData.value('valorDocId[1]','int') valorDocId,
    xData.value('contrasenna[1]','varchar(20)') clave
from @fileData.nodes('/dataset/Administrador') as 
x(xData)

但是现在我需要读取一个没有标签组织的xml文件,至少不像上一个,xml是这样的:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <Administrador id="1" nombre="Nelle" valorDocId="8399335355" contrasenna="Glenn"/>
    <Administrador id="2" nombre="Gayler" valorDocId="1310348693" contrasenna="Madonna"/>
</dataset>

但是我之前使用的代码不起作用,它会抛出一个错误,说我无法在“id”列中插入 NULL 值,所以我认为数据没有被读取。那么我怎样才能读取第二个文件呢?

标签: sqlsql-serverxml

解决方案


例子

Declare @XML xml = '
<dataset>
    <Administrador id="1" nombre="Nelle" valorDocId="8399335355" contrasenna="Glenn"/>
    <Administrador id="2" nombre="Gayler" valorDocId="1310348693" contrasenna="Madonna"/>
</dataset>
'

Select id          = x.v.value('@id','int')
      ,nombre      = x.v.value('@nombre','varchar(50)')
      ,valorDocId  = x.v.value('@valorDocId','varchar(50)')
      ,contrasenna = x.v.value('@contrasenna','varchar(50)')
 From  @Xml.nodes('dataset/Administrador') x(v)

退货

id  nombre  valorDocId  contrasenna
1   Nelle   8399335355  Glenn
2   Gayler  1310348693  Madonna

编辑 - 从文件中获取 XML

Declare @XML xml
Select @XML = BulkColumn FROM  OPENROWSET(BULK 'C:\Working\SomeXMLFile.xml', SINGLE_BLOB) x;

Select id          = x.v.value('@id','int')
      ,nombre      = x.v.value('@nombre','varchar(50)')
      ,valorDocId  = x.v.value('@valorDocId','varchar(50)')
      ,contrasenna = x.v.value('@contrasenna','varchar(50)')
 From  @Xml.nodes('dataset/Administrador') x(v)

推荐阅读