Guidelines for Using xml Data Type Methods
W tym temacie opisano wskazówki dotyczące używania xml metody typu danych.
Instrukcja PRINT
The xml data type methods cannot be used in the PRINT instrukcja as shown in the following example.The xml data type methods are treated as subqueries, and subqueries are not allowed in the PRINT instrukcja.W poniższym przykładzie 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 do przydzielania wynik Value() Metoda zmienną XML wpisz, a następnie określ zmienną 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 GROUP BY
The xml data type methods are treated internally as subqueries.Ponieważ GROUP BY wymaga wartość skalarna i nie zezwala na zagregowanych i podkwerend, nie można określić XML danych wpisz metod w klauzula GROUP BY.Rozwiązanie to wywołanie funkcja zdefiniowanej przez użytkownika, używający metody XML wewnątrz go.
Raportowanie błędów
Gdy raportowanie błędów, XML danych typu metody podnoszenia jeden błąd 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
Pojedyncza czeki
Kroki w lokalizacji, parametrów funkcja i operatorów, które wymagają singletons zwróci błąd, jeśli kompilator nie może ustalić, czy pojedyncza jest gwarantowane, że przy uruchomieniu czas.Ten problem występuje często bez typu danych.Na przykład wyszukiwanie atrybut wymaga elementu nadrzędnego pojedynczych.Liczba porządkowa wybierające pojedynczego nadrzędnym jest wystarczająca.Ocena bieżących-Value() kombinacji wyodrębnić wartości atrybut nie mogą wymagać porządkowa specyfikacji.Jest ona wyświetlana w kolejnym przykładzie.
Przykład: Znane Singleton
W tym przykładzie nodes() metoda generuje oddzielny wiersz dla każdego elementu <book> .The value() metoda that is evaluated on a <book> node extracts the value of @genre and, being an atrybut, is a singleton.
SELECT nref.value('@genre', 'varchar(max)') LastName
FROM T CROSS APPLY xCol.nodes('//book') AS R(nref)
Schemat XML jest używany dla kontrola typów wpisywanych XML.Jeśli węzeł zostanie określony jako pojedyncza w schemacie XML, kompilator używa tych informacji i błąd nie wystąpi.W przeciwnym razie liczebniki, które wybiera jeden węzeł jest wymagany.W szczególności, korzystanie z obiektu podrzędnego lub automatycznej oś (/ /) oś, na przykład w/księgi / / title, utraci pojedynczych Kardynalność wnioskowanie o <tytuł> element, nawet wtedy, gdy schemat XML określa się sposób. W związku z tym, który należy ponownie go jako (/ księgi / / title) [1].
Ważne jest pamiętać o różnicy pomiędzy //first-name[1 pozostają] i (//first-name)[1] dla kontrola typów.Pierwsza zwraca sekwencji <Pierwsze imię> węzły, w którym każdy węzeł jest po lewej stronie <Pierwsze imię> węzeł między tym samym poziomie. Ten ostatni zwraca pierwszy pojedyncza <Pierwsze imię> węzeł w kolejności dokumentu w kodzie XML wystąpienie.
Przykład: Przy użyciu value()
Wynikiem następującej kwerendy na kolumnie XML bez typu statycznego, jest error.This kompilacji, ponieważ Value() oczekuje, że węzeł pojedynczych jako pierwszy argument i kompilator nie może ustalić, czy tylko jeden węzeł ostatnią nazwę > < wystąpi w czasie wykonywania:
SELECT xCol.value('//author/last-name', 'nvarchar(50)') LastName
FROM T
To rozwiązanie, które możesz 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ły mogą występować w każdym XML wystąpienie. Tekst poprawiony 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 z wystąpień XML.