SQL Query用于解析XML字段并检索值

时间:2013-03-27 13:56:33

标签: sql sql-server xml parsing

我正在尝试解析XML字段,该字段是SCOM 2007数据仓库数据库的一部分,并且发现了许多示例,这些示例显示了实现此目的的类似方案,但似乎没有任何内容返回值,通常是在我运行查询时它出错。 / p>

这是一个例子,我需要运行一个左右的一行,我想要输入英格兰和英国的值(构成标记的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查询初期,并且以前从未做过类似的事情。

1 个答案:

答案 0 :(得分: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