- XQuery przeciwko typowi danych xml
- Ogólne przypadki użycia XQuery
- XQuery wykorzystujące hierarchię
-
Wszystko na blogu Michaela Rysa
Aktualizacja
Moim zaleceniem byłoby rozdrobnienie XML-a na relacje i wykonanie przeszukiwania i złączeń w wynikowej relacji, w sposób zorientowany na zbiór, a nie w sposób proceduralny polegający na przeszukiwaniu określonych węzłów w XML. Oto proste zapytanie XML, które usuwa interesujące węzły i atrybuty:
select x.value(N'../../../../@stepId', N'int') as StepID
, x.value(N'../../@id', N'int') as ComponentID
, x.value(N'@nom',N'nvarchar(100)') as Nom
, x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x)
Jeśli jednak musisz użyć ścieżki XPath, która pobiera dokładnie interesującą Cię wartość:
select x.value(N'@valeur', N'nvarchar(100)') as Valeur
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled"]') t(x)
Jeśli stepID i komponent ID są kolumnami, a nie zmiennymi, należy użyć funkcji sql:column() zamiast sql:variable w filtrach XPath. Zobacz Wiązanie danych relacyjnych w danych XML .
I na koniec, jeśli wszystko, czego potrzebujesz, to sprawdzić istnienie, możesz użyć istnieje( ) Metoda XML:
select @x.exist(
N'/xml/box[@stepId=sql:variable("@stepID")]/
components/component[@id = sql:variable("@componentID")]/
variables/variable[@nom="Enabled" and @valeur="Yes"]')