2013-03-27 12 views
5

Próbuję parsować pole XML, które jest częścią bazy danych hurtowni danych SCOM 2007 i znalazłem wiele przykładów, które pokazują podobne scenariusze osiągania tego, jednak nic nie zwraca wartości, zwykle kiedy uruchomię kwerendę, to błędy.Zapytanie SQL do parsowania pola XML i pobierania wartości

Oto przykład, jeden wiersz z około tysiąca potrzebuję uruchomić to przeciwko, gdzie chcę pobrać wartości Anglii i Wielkiej Brytanii (GUID, które składają się na tag są spójne dla każdego typu danych, więc nigdy się nie zmieniaj i może być użyty do zapytania itp.). Oczywiście każdy rząd ma inny kod miasta i kraju i to właśnie chcę uchwycić.

Nazwa tabeli jest dbo.ManagedEntityProperty i nazwa kolumny jest 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> 

Wszelkie porady lub wskazówki? Próbowałem wdrożyć porady na temat SQL Server query xml attribute for an element value, ale wciąż jestem bardzo w moim dziecku SQL SQL i nigdy wcześniej nie musiałem robić czegoś takiego.

Odpowiedz

3

spróbować czegoś takiego:

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

Zasadniczo wymienia wszystkie <Property> węzłów w tabeli w poszczególnych rzędach, a gdy chwyta dwie pozycje jesteś zainteresowany z tych wierszy

Aktualizacja: jeśli chcesz wyświetlić te dwie wartości jako oddzielne kolumny, musisz użyć czegoś takiego:

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

Genialny, rea lly szybka reakcja tam i działa świetnie. Musiałem tylko poprawić część deklaracji, ponieważ używam SQL 2005, ale to moja wina, ponieważ nie powiedziałem ci wersji :) – user2215800

+0

Gdybym chciał wyświetlić wynik, dwie wartości XML w tym samym wierszu, ale inne kolumny , jak bym to zrobił? Próbuję zrozumieć moją "(.)" I jak mogę zmienić zachowanie skryptu z tego, aby być może celować oddzielnie w każdy identyfikator GUID, zamiast wyliczać wszystko, a następnie filtrować. Wiesz co mam na myśli? – user2215800

+0

@ user2215800: zaktualizowałem moją odpowiedź –