Mam następujące zapytanie SQL:odpytywanie które posiadają węzeł xmlns atrybuty
DECLARE @XMLDOC XML
SET @XMLDOC = '<Feed><Product><Name>Foo</Name></Product></Feed>'
SELECT x.u.value('Name[1]', 'varchar(100)') as Name
from @XMLDOC.nodes('/Feed/Product') x(u)
Powrócisz:
Name
----
Foo
Jednak jeśli węzeł <Feed>
ma atrybut xmlns
, to nie robi „t zwróciło żadnych wyników:
DECLARE @XMLDOC XML
SET @XMLDOC = '<Feed xmlns="bar"><Product><Name>Foo</Name></Product></Feed>'
SELECT x.u.value('Name[1]', 'varchar(100)') as Name
from @XMLDOC.nodes('/Feed/Product') x(u)
Returns:
Name
----
Dzieje się tak tylko wtedy, gdy mam atrybut xmlns
, wszystko inne działa poprawnie.
Dlaczego tak jest i jak mogę zmodyfikować moje zapytanie SQL, aby zwracać wyniki niezależnie od atrybutów?
+1 Czy istnieje sposób na po prostu ignorowanie xmlns? Kusiło mnie, aby przekonwertować typ danych "XML" na ciąg znaków, usunąć atrybut xmlns, a następnie odrzucić go ... – Curt
Naprawdę nie dbam o przestrzeń nazw, a to jest plik danych stron trzecich z wersjami na xmlns URL, więc jest podatny na zewnętrzne zmiany – Curt
@Curt: nie, jeśli przestrzeń XML jest w twoim XML, nie możesz po prostu jej zignorować - musisz sobie z tym poradzić. Jeśli masz tylko jedną przestrzeń nazw XML - użyj podejścia nr 1, aby zdefiniować je jako domyślną przestrzeń nazw XML, która powinna być dość prosta i prosta w użyciu. –