2013-03-27 75 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