如何从sql表中选择xml数据

时间:2014-01-17 03:41:59

标签: sql sql-server xml

我正在尝试编写一个sql查询,以便从MS Sql Server 2012数据库表中的xml数据类型列获取如下结果 数据存储在数据库中,如下所示

ID  |Summary
==========================
1   |<Summary><Field Key="Col1" Value="S1" /><Field Key="Col2" Value="N" /></Summary>
2   |<Summary><Field Key="Col1" Value="S2" /><Field Key="Col2" Value="Y" /></Summary>

我需要一个记录结果集如下

ID    |    Col1      |  Col2
==========================
1     |    S1        |  N
2     |    S2        |  Y

你能帮我解决一下吗?

2 个答案:

答案 0 :(得分:0)

由于您使用的是MSSQL的XML,因此您应该熟悉XML类型的.query()函数。

IF NOT EXISTS ( SELECT  1
                FROM    sys.objects
                WHERE   name = 'XMLParty'
                    AND type = 'U' )
BEGIN
    --DROP TABLE dbo.XMLParty;
    CREATE TABLE dbo.XMLParty
    (
        ID          INTEGER IDENTITY( 1, 1 ) NOT NULL,
                        PRIMARY KEY ( ID ),
        Summary     XML
    );
END;

INSERT INTO dbo.XMLParty ( Summary )
VALUES ( '<Summary><Field Key="Surname" Value="S1" /><Field Key="Action" Value="N" /></Summary>' );

INSERT INTO dbo.XMLParty ( Summary )
VALUES ( '<Summary><Field Key="Surname" Value="S2" /><Field Key="Action" Value="Y" /></Summary>' );
GO

SELECT  ID,
        Surname = Summary.value( '( ./Summary/Field/@Value )[ 1 ]', 'VARCHAR( MAX )' ),
        Value = Summary.value( '( ./Summary/Field/@Value )[ 2 ]', 'VARCHAR( MAX )' ),
        Summary.query( '.' )
FROM    dbo.XMLParty;

使用.query( '.' )的结果绝对是完全相同的,只需选择Summary列,但语法可以让您深入了解如何使用.value()功能为您想要的结果。 .是您的XML的根,您可以使用xmlField.value( '( ./Root/Node )[ n ]', 'VARCHAR( MAX )' )查询节点值(xmlField.value( '( ./Root/Node/@Attribute )[ n ]', 'VARCHAR( MAX )' )或属性(如上所述)。

有许多陷阱,比如使用<R><N><A v="1" /><A v="2" /></N><N><A v="3" /></N></R>之类的XML时,.value( '( ./R/N/A/@v )[ 3 ]', 'VARCHAR( MAX )' )甚至没有远程关注A节点在不同的N个节点中(只关心关卡),但是再次,.query()将帮助你解决很多问题。

答案 1 :(得分:0)

您使用value())从XML中提取值。第一个参数是用于定位值的XQuery表达式,第二个参数是数据类型。

下面使用的XQuery表达式是(/Summary/Field[@Key = "Col1"]/@Value)[1]

如果从右到左阅读说:
给我从属性Value中找到的第一个值,其中属性KeyCol1,其中Field为子FieldSummarySummary是根元素。

SQL Fiddle

MS SQL Server 2008架构设置

create table T
(
  ID int,
  Summary xml
)

insert into T values
(1, '<Summary><Field Key="Col1" Value="S1" /><Field Key="Col2" Value="N" /></Summary>'),
(2, '<Summary><Field Key="Col1" Value="S2" /><Field Key="Col2" Value="Y" /></Summary>')

查询1

select T.ID,
       T.Summary.value('(/Summary/Field[@Key = "Col1"]/@Value)[1]', 'varchar(10)') as Col1,
       T.Summary.value('(/Summary/Field[@Key = "Col2"]/@Value)[1]', 'varchar(10)') as Col2
from T

<强> Results

| ID | COL1 | COL2 |
|----|------|------|
|  1 |   S1 |    N |
|  2 |   S2 |    Y |