2013-03-27 5 views
5

Ich versuche, ein XML-Feld zu analysieren, das Teil der Data Warehouse-Datenbank von SCOM 2007 ist, und habe viele Beispiele gefunden, die ähnliche Szenarien zeigen Wenn ich die Abfrage ausführen, wird ein Fehler angezeigt.SQL-Abfrage zum Analysieren des XML-Felds und Abrufen von Werten

Hier ist ein Beispiel, eine Zeile von tausend oder so Ich muss dies gegen ausführen, wo ich die Werte England und UK (die GUIDs, die das Tag umfassen konsistent sind für jeden Datentyp, also nie ändern wollen) und kann verwendet werden, um usw.) abzufragen. Natürlich hat jede Zeile einen anderen Stadt- und Ländercode und das möchte ich erfassen.

Der Tabellenname ist dbo.ManagedEntityProperty und der Spaltenname ist 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> 

Jede Beratung oder Beratung? Ich habe versucht, Ratschläge gemäß SQL Server query xml attribute for an element value zu implementieren, aber ich bin immer noch sehr in meiner SQL-XML-Anfrage-Kindheit und musste noch nie so etwas machen.

Antwort

3

versuchen, etwas wie folgen aus:

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

Diese aufzählt grundsätzlich alle <Property> Knoten in der Tabelle in einzelne Zeilen, und wenn die beiden Elemente packen die Sie sich interessieren aus diesen Reihen

Update:, wenn Sie diese beiden Werte als separate Spalten zeigen müssen, würden Sie so etwas verwenden:

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

Brilliant, rea lly schnelle Antwort dort und es funktioniert super. Ich musste nur den Deklarationsteil optimieren, da ich SQL 2005 verwende, aber das ist mein Fehler, weil ich Ihnen die Version nicht gesagt habe :) – user2215800

+0

Wenn ich die Ausgabe anzeigen wollte, die zwei XML-Werte in der gleichen Zeile, aber unterschiedlichen Spalten Wie würde ich das machen? Ich versuche, meinen Kopf um das "(.)" Zu bringen und wie ich das Skriptverhalten von diesem ändern könnte, um vielleicht jede GUID separat anzusprechen, anstatt alles aufzuzählen und dann zu filtern. Weißt Du, was ich meine? – user2215800

+0

@ user2215800: meine Antwort aktualisiert –

Verwandte Themen