我正在尝试编写一个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
你能帮我解决一下吗?
答案 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
中找到的第一个值,其中属性Key
为Col1
,其中Field
为子Field
为Summary
而Summary
是根元素。
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 |