Wskazówki dotyczące używania metod typu danych xml
W tym temacie opisano wskazówki dotyczące używania xml Typ danych metod.
Instrukcja wydruku
Xml metody typu danych nie można używać w wydruku instrukcja , jak pokazano w poniższym przykładzie.Xml metody typu danych są traktowane jako podkwerend i podkwerend nie są dozwolone w wydruku instrukcja.Poniższy przykład zwraca w wyniku błąd:
DECLARE @x xml
SET @x = '<root>Hello</root>'
PRINT @x.value('/root[1]', 'varchar(20)') -- will not work because this is treated as a subquery (select top 1 col from table)
To rozwiązanie jest najpierw przypisać wynik value() metoda do zmiennej xml wpisz, a następnie określ zmiennej w kwerendzie.
DECLARE @x xml
DECLARE @c varchar(max)
SET @x = '<root>Hello</root>'
SET @c = @x.value('/root[1]', 'varchar(11)')
PRINT @c
Klauzula według grupy
Xml metody typu danych są wewnętrznie traktowane jako podkwerend.Ponieważ grupy przez wymaga wartość skalarna i nie zezwala na zebranie i podkwerend, nie można określić xml metod typu danych w grupy według klauzula.Rozwiązanie jest zdefiniowany przez użytkownika funkcja używający metody XML wewnątrz go.
Raportowanie błędów
Gdy raportowanie błędów, xml metody typu danych podnieść pojedynczego błędu w następującym formacie:
Msg errorNumber, Level levelNumber, State stateNumber:
XQuery [database.table.method]: description_of_error
Na przykład:
Msg 2396, Level 16, State 1:
XQuery [xmldb_test.xmlcol.query()]: Attribute may not appear outside of an element
Kontrole Singleton
Kroki lokalizacji, parametry funkcja i operatorów, które wymagają singletons zwróci błąd, jeśli kompilator nie może stwierdzić, czy pojedyncza jest gwarantowane w czaswykonywania.Ten problem występuje często bez typu danych.Na przykład wyszukiwanie atrybut wymaga singleton elementu nadrzędnego.Liczba porządkowa, który wybiera węzeł nadrzędny pojedynczego jest wystarczająca.Ocena bieżących-value() kombinację, aby wyodrębnićwartościatrybut nie mogą wymagać specyfikacji porządkowych. Jest to zademonstrowane w następnym przykładzie.
Przykład: Znane Singleton
W tym przykładzie nodes() metoda generuje oddzielny wiersz dla każdego <book> element.Value() metoda oceny na <book> węzeł wyodrębnia wartość @ gatunek i, jest atrybutjest pojedyncza.
SELECT nref.value('@genre', 'varchar(max)') LastName
FROM T CROSS APPLY xCol.nodes('//book') AS R(nref)
Schemat XML jest używany do kontrola typów maszynowy XML.Jeśli węzeł jest określony jako pojedyncza w schemacie XML, kompilator używa tych informacji i błąd nie wystąpi.W przeciwnym razie porządkowych, który wybiera jeden węzeł jest wymagany.W szczególności, wykorzystanie elementów podrzędnych lub self oś (/ /) oś, takie jak w/książki / title, utraci singleton kardynalność wnioskowanie o <tytuł> element, nawet jeśli schemat XML określa się sposób.W związku z tym, należy napisać ponownie jako (/ książki / title) [1].
Ważne jest, aby pamiętać o różnicy między //first-name[1 pozostają] i ([//first-name)[1] kontrola typów.Byłej zwraca sekwencji <Pierwsze imię> węzłów, w których każdy węzeł jest po lewej stronie <-imię> węzeł między tym samym poziomie.Te ostatnie zwraca pierwszy singleton <-imię> węzła w kolejności dokumentu XML wystąpienie.
Przykład: Przy użyciu value()
Następująca kwerenda bez typu XML kolumna wyniki w statycznych, błąd kompilacji.Wynika to z value() oczekuje jako pierwszy argument i kompilator nie może określić, czy tylko jeden węzeł singleton <nazwy ostatniego> węzeł zostanie przeprowadzona w czaswykonywania:
SELECT xCol.value('//author/last-name', 'nvarchar(50)') LastName
FROM T
Rozwiązanie, które można rozważyć jest następujący:
SELECT xCol.value('//author/last-name[1]', 'nvarchar(50)') LastName
FROM T
Jednakże rozwiązanie to nie rozwiązuje błąd, ponieważ wiele <author> węzłów może występować w każdym XML wystąpienie.Przeróbka następujące działania:
SELECT xCol.value('(//author/last-name/text())[1]', 'nvarchar(50)') LastName
FROM T
Ta kwerenda zwraca wartość pierwszego <last-name> element w każdym XML wystąpienie.