5

我正在尝试解析一个 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 查询 xml 属性实现建议,但我仍然处于 SQL XML 查询的初级阶段,以前从未做过类似的事情。

4

1 回答 1

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
于 2013-03-27T14:02:14.217 回答