2013-03-27 77 views
5

我试图解析属于SCOM 2007数据仓库数据库一部分的XML字段,并发现了许多示例,显示了实现此目的的类似方案,但没有任何内容显示返回值当我运行查询它错误。用于解析XML字段和检索值的SQL查询

这里是一个例子,我需要运行一个这样的例子,我想要拉入英格兰和英国的值(组成标签的GUID对于每种数据类型都是一致的,所以从不改变并可用于查询等)。当然,每一行都有不同的城市和国家代码,这就是我想要捕捉的。

表名是dbo.ManagedEntityProperty和列名是PropertyXML

<Root> 
      <Property Guid="AFB4F9E6-BF48-1737-76AD-C9B3EC325B97">192.168.1.0</Property> 
      <Property Guid="5C324096-D928-76DB-E9E7-E629DCC261B1">WASPDC01.LIV10.Local</Property> 
      <Property Guid="96981E2D-DECF-7CB7-DEC5-5C52046B68A6">192.168.1.0</Property> 
      <Property Guid="FA3887C3-F274-306A-867C-37105A190F78">England</Property> 
      <Property Guid="61AA7309-595F-576E-337E-E9335E5CA773">255.255.255.0</Property> 
      <Property Guid="F8ABF27F-A169-6FCD-1862-C06F1DB4BF24">UK</Property> 
      <Property Guid="B832B2DE-A649-60A1-AC13-06F1EC601E5F">Active</Property> 
</Root> 

任何建议或指导?我试图按照SQL Server query xml attribute for an element value来实施建议,但我仍然非常喜欢SQL XML查询,并且从来没有做过这样的事情。

回答

3

尝试这样:

-- declare your two GUIDs that you're interested in 
DECLARE @GuidCountry UNIQUEIDENTIFIER 
SET @GuidCountry = 'FA3887C3-F274-306A-867C-37105A190F78' 

DECLARE @GuidCountryCode UNIQUEIDENTIFIER 
SET @GuidCountryCode = 'F8ABF27F-A169-6FCD-1862-C06F1DB4BF24' 

;WITH ListOfAllProperties AS 
(
    SELECT 
     ID, -- or whatever uniquely identifies a single row in your table 
     PropertyGuid = XProp.value('@Guid', 'uniqueidentifier'), 
     PropertyValue = XProp.value('(.)', 'varchar(100)') 
    FROM 
     dbo.ManagedEntityProperty 
    CROSS APPLY 
     PropertyXML.nodes('/Root/Property') AS XTbl(XProp) 
) 
SELECT * 
FROM ListOfAllProperties 
WHERE PropertyGuid IN (@GuidCountry, @GuidCountryCode) 

这基本上列举了您的表到各行的所有<Property>节点,并抓住了两个项目,当你从那些行

更新感兴趣:如果你需要显示这两个值作为单独的列,你必须使用这样的事情:

SELECT 
    ID, 
    CountryCode = PropertyXML.value('(/Root/Property[@Guid=sql:variable("@GuidCountryCode")]/text())[1]', 'varchar(100)'), 
    CountryName = PropertyXML.value('(/Root/Property[@Guid=sql:variable("@GuidCountry")]/text())[1]', 'varchar(100)') 
FROM 
    dbo.ManagedEntityProperty 
+0

辉煌,在那里快速响应,并且效果很好。只需要调整声明部分,因为我使用SQL 2005,但这是我的错,因为我没有告诉你版本:) – user2215800 2013-03-27 14:30:33

+0

如果我想显示输出,两个XML值在同一行,但不同的列,我会怎么做呢?我试图让自己的头部围绕'(。)',以及如何将脚本行为从此更改为可能单独针对每个GUID,而不是枚举所有过滤。明白我的意思了吗? – user2215800 2013-03-27 16:06:35

+0

@ user2215800:更新了我的回复 – 2013-03-27 16:44:22