Udostępnij za pośrednictwem


Tworzenie wystąpień danych XML

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

W tym artykule opisano sposób generowania wystąpień XML.

W programie SQL Server można wygenerować wystąpienia XML w następujący sposób:

  • Wpisz rzutowanie wystąpień ciągów.
  • Używanie instrukcji SELECT z klauzulą FOR XML .
  • Używanie przypisań stałych.
  • Używanie ładowania zbiorczego.

Typ ciąg rzutowy i wystąpienia binarne

Możesz parsować dowolne typy danych ciągów znakowych SQL Server, takie jak [n]varchar, [n]char, [n]text, varbinary i image, do typu danych xml przez rzutowanie (CAST) lub konwertowanie ciągu CONVERT na typ danych xml. Nietypowy kod XML jest sprawdzany, aby potwierdzić, że jest poprawnie sformułowany. Jeśli istnieje schemat skojarzony z typem xml , walidacja jest również wykonywana. Aby uzyskać więcej informacji, zobacz Porównanie typizowanego kodu XML do nietypowego kodu XML.

Dokumenty XML mogą być kodowane przy użyciu różnych kodowań (na przykład UTF-8, UTF-16, Windows-1252). Poniżej przedstawiono reguły interakcji ciągów i typów źródłowych binarnych z kodowaniem dokumentu XML i zachowaniem analizatora.

Ponieważ nvarchar zakłada kodowanie Unicode 2-bajtowe, takie jak UTF-16 lub UCS-2, analizator XML traktuje wartość ciągu jako 2-bajtowy kodowany dokument XML lub fragment. Dokument XML musi być zakodowany w 2-bajtowym kodowaniu Unicode, a także być zgodny z typem danych źródłowych. Zakodowany dokument XML UTF-16 może mieć znak kolejności bajtów UTF-16 (BOM), ale nie musi, ponieważ kontekst typu źródłowego jasno pokazuje, że może to być tylko dokument zakodowany w formacie Unicode 2 bajtów.

Zawartość ciągu varchar jest traktowana jako kodowany 1-bajtowy dokument XML/fragment przez analizator XML. Ponieważ ciąg źródłowy varchar ma skojarzona stronę kodową, analizator używa tej strony kodowej do kodowania, jeśli nie określono jawnego kodowania w samym kodzie XML. Jeśli wystąpienie XML ma obiekt BOM lub deklarację kodowania, obiekt BOM lub deklaracja musi być spójna ze stroną kodową, w przeciwnym razie analizator zgłasza błąd.

Zawartość elementu varbinary jest traktowana jako strumień punktu kodu przekazywany bezpośrednio do analizatora XML. W związku z tym dokument XML lub fragment musi podać wbudowany element BOM lub inne informacje dotyczące kodowania. Analizator analizuje tylko strumień w celu określenia kodowania. Oznacza to, że XML kodowane w UTF-16 musi zawierać BOM UTF-16, a przypadek bez BOM i bez deklaracji kodowania jest interpretowany jako UTF-8.

Jeśli kodowanie dokumentu XML nie jest znane z wyprzedzeniem, a dane są przekazywane jako ciąg znaków lub dane binarne zamiast danych XML przed rzutowaniem na XML, należy traktować dane jako varbinary. Na przykład podczas odczytywania danych z pliku XML przy użyciu metody OpenRowset()należy określić dane, które mają być odczytywane jako wartość varbinary(max):

SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

Program SQL Server wewnętrznie reprezentuje kod XML w wydajnej reprezentacji binarnej, która używa kodowania UTF-16. Kodowanie dostarczone przez użytkownika nie jest zachowywane, ale jest brane pod uwagę podczas procesu analizowania.

Typy rzutowania CLR zdefiniowane przez użytkownika

Jeśli typ zdefiniowany przez użytkownika CLR ma serializację XML, wystąpienia tego typu mogą być jawnie rzutowane na typ danych XML. Aby uzyskać więcej informacji na temat serializacji XML typu zdefiniowanego przez użytkownika CLR, zobacz Serializacja XML z obiektów bazy danych CLR.

Obsługa białych znaków w wpisanym formacie XML

W programie SQL Server białe znaki wewnątrz zawartości elementu są ignorowane, jeśli znajdują się w sekwencji danych złożonej wyłącznie z białych znaków, rozdzielonej znacznikami, takimi jak znaczniki początkowe lub końcowe, i nie są zamienione na encje. (CDATA sekcje są ignorowane). To zarządzanie białymi znakami różni się od tego, jak opisano białe znaki w specyfikacji XML 1.0 opublikowanej przez World Wide Web Consortium (W3C). Dzieje się tak, ponieważ analizator XML w programie SQL Server rozpoznaje tylko ograniczoną liczbę podzestawów DTD, zgodnie z definicją w formacie XML 1.0. Aby uzyskać więcej informacji na temat ograniczonych podzestawów DTD obsługiwanych w programie SQL Server, zobacz CAST i CONVERT.

Domyślnie analizator XML odrzuca nieistotne białe znaki podczas konwertowania danych ciągu na XML, jeśli którakolwiek z następujących opcji ma wartość true:

  • Atrybut xml:space nie jest zdefiniowany dla elementu ani jego elementów nadrzędnych.

  • Atrybut xml:space , który ma wpływ na element lub jeden z jego elementów nadrzędnych, ma wartość domyślną.

Przykład:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

Oto zestaw wyników.

<root><child/></root>

Można jednak zmienić to zachowanie. Aby zachować białe znaki w instancji DT XML, użyj operatora CONVERT oraz opcjonalnego parametru styl, ustawiając go na wartość 1. Przykład:

SELECT CONVERT(XML, N'<root>      <child/>     </root>', 1);

Jeśli parametr stylu nie jest używany lub jego wartość jest ustawiona na 0, nieistotne białe znaki nie są zachowywane przy konwersji instancji XML DT. Aby uzyskać więcej informacji o sposobie używania operatora CONVERT i jego parametru stylu podczas konwertowania danych ciągu na wystąpienia xml DT, zobacz CAST and CONVERT (Rzutowanie i konwertowanie).

Przykład: rzutowanie wartości ciągu na typowany kod XML i przypisywanie go do kolumny

Poniższy przykład rzutuje zmienną ciągu zawierającą fragment XML na typ danych XML , a następnie zapisuje ją w kolumnie typu xml :

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);
GO

DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

Następująca operacja wstawiania niejawnie konwertuje z ciągu na typ xml :

INSERT INTO T
VALUES (3, @s);

Możesz jawnie CAST rzutować ciąg na typ xml :

INSERT INTO T
VALUES (3, CAST(@s AS XML));

Możesz też użyć metody CONVERT, jak pokazano w poniższym przykładzie kodu:

INSERT INTO T
VALUES (3, CONVERT(XML, @s));

Przykład: konwertowanie ciągu na wpisany kod XML i przypisywanie go do zmiennej

W poniższym przykładzie ciąg jest konwertowany na typ xml i przypisywany do zmiennej typu danych XML :

DECLARE @x XML;
DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);

SELECT @x;

Używanie instrukcji SELECT z klauzulą FOR XML

Klauzulę FOR XML w instrukcji SELECT można użyć, aby zwrócić wyniki jako kod XML. Przykład:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT Column1, Column2
        FROM Table1, Table2
        WHERE <some_condition>
        FOR XML AUTO
)
...;

Instrukcja SELECT zwraca tekstowy fragment XML, który jest następnie analizowany podczas przypisywania do zmiennej typu danych XML .

Możesz również użyć dyrektywy TYPE w zapytaniach FOR XML w FOR XML klauzuli , która bezpośrednio zwraca FOR XML wynik zapytania jako typ xml :

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT @xmlDoc;

Oto zestaw wyników.

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

W poniższym przykładzie wpisany wynik FOR XML zapytania jest wstawiany do kolumny typu xml:

CREATE TABLE T1 (
    c1 INT,
    c2 XML
);
GO

INSERT T1 (c1, c2)
SELECT 1, (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT *
FROM T1;
GO

Aby uzyskać więcej informacji na temat FOR XML, zapoznaj się z FOR XML (SQL Server).

Uwaga / Notatka

SQL Server zwraca instancje typu danych XML do klienta w wyniku różnych konstrukcji serwera, takich jak FOR XML zapytania korzystające z TYPE dyrektywy, lub gdzie typ danych XML jest używany do zwracania XML z kolumn, zmiennych i parametrów wyjściowych silnika bazy danych SQL Server. W kodzie aplikacji klienckiej dostawca ADO.NET żąda wysyłania informacji o tym typie danych XML w kodowaniu binarnym z serwera. Jeśli jednak używasz FOR XML bez TYPE dyrektywy, dane XML są zwracane jako typ ciągu. W każdym razie dostawca klienta będzie zawsze mógł obsłużyć jedną z form XML.

Używanie przypisań stałych

Można użyć stałej ciągu tam, gdzie oczekuje się wystąpienia typu danych xml. To przypisanie jest takie samo, jak implikowane CAST ciągi xml. Przykład:

DECLARE @xmlDoc XML;

SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

Poprzedni przykład niejawnie konwertuje ciąg na typ danych XML i przypisuje go do zmiennej typu xml .

Poniższy przykład wstawia ciąg stały do kolumny typu xml :

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);

INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

Uwaga / Notatka

W przypadku wpisanego kodu XML kod XML jest weryfikowany względem określonego schematu. Aby uzyskać więcej informacji, zobacz Porównanie typizowanego kodu XML do nietypowego kodu XML.

Używanie ładowania zbiorczego

Ulepszona funkcja OPENROWSET umożliwia zbiorcze ładowanie dokumentów XML w bazie danych. Wystąpienia XML można ładować zbiorczo z plików do kolumn typu xml w bazie danych. Aby zapoznać się z przykładami pracy, zobacz Przykłady zbiorczego importowania i eksportowania dokumentów XML (SQL Server). Aby uzyskać więcej informacji na temat ładowania dokumentów XML, zobacz Ładowanie danych XML.

W tym dziale

Artykuł Opis
Opcje zapytania XML i zachowane dane Opisuje części wystąpień XML, które nie są zachowywane podczas przechowywania ich w bazach danych.