【问题标题】:SQL Query to parse XML field and retrieve values用于解析 XML 字段并检索值的 SQL 查询
【发布时间】:2013-03-27 13:56:32
【问题描述】:

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

这是一个示例,一千左右的一行我需要运行它,我想在其中提取值 England 和 UK(组成标签的 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 查询的初级阶段,以前从未做过类似的事情。

【问题讨论】:

    标签: sql sql-server xml parsing


    【解决方案1】:

    试试这样的:

    -- 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)
    

    这基本上将表中的所有&lt;Property&gt; 节点枚举到单独的行中,并在从这些行中获取您感兴趣的两个项目时

    更新:如果您需要将这两个值显示为单独的列,则必须使用以下内容:

    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
    

    【讨论】:

    • 非常棒,响应速度非常快,而且效果很好。当我使用 SQL 2005 时,只需要调整声明部分,但这是我的错,因为我没有告诉你版本:)
    • 如果我想显示输出,两个 XML 值在同一行但不同的列,我该怎么做?我试图了解“(。)”以及如何将脚本行为从这里更改为可能分别针对每个 GUID,而不是枚举所有然后过滤。明白我的意思吗?
    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多