Vytváření instancí dat XML
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Tento článek popisuje, jak generovat instance XML.
Na SQL Serveru můžete vygenerovat instance XML následujícími způsoby:
- Přetypování instancí řetězců.
- Použití příkazu
SELECT
s klauzulíFOR XML
- Použití konstantních přiřazení
- Použití hromadného načtení
Přetypování řetězců a binárních instancí
Můžete parsovat libovolný z datových typů řetězců SQL Serveru, jako jsou [n]varchar, [n]char, [n]text, varbinarya obrázek , do datového typu xml přetypováním (CAST
) nebo převodem (CONVERT
) řetězce na datový typ xml. Netypovaný kód XML je zkontrolován, aby se ověřilo, že je dobře utvořený. Pokud je schéma přidružené k typu xml , provede se také ověření. Další informace naleznete v tématu Porovnání typovaného XML s netypovaným XML.
Dokumenty XML lze kódovat pomocí různých kódování (například UTF-8, UTF-16, Windows-1252). Následující informace popisují pravidla pro interakci řetězců a binárních zdrojových typů s kódováním dokumentu XML a chování analyzátoru.
Vzhledem k tomu, nvarchar předpokládá kódování Unicode o 2 bajtech, jako je UTF-16 nebo UCS-2, analyzátor XML považuje hodnotu řetězce za 2 bajt kódovaný dokument XML nebo fragment. Aby byl dokument XML kompatibilní se zdrojovým datovým typem, musí být kódován v kódování Unicode s 2 bajty. Dokument XML kódovaný v UTF-16 může mít značku pořadí bajtů (BOM) UTF-16, ale nemusí, protože kontext typu zdroje jasně ukazuje, že může být pouze dvoubajtovým dokumentem kódovaným Unicode.
Obsah řetězce varchar se považuje za 1 bajtový kódovaný dokument NEBO fragment XML analyzátorem XML. Vzhledem k tomu, že zdrojový řetězec varchar má přidruženou znakovou stránku, analyzátor tuto znakovou stránku použije pro kódování, pokud v samotném XML není zadáno žádné explicitní kódování. Pokud má instance XML kusovník nebo deklaraci kódování, musí být kusovník nebo deklarace konzistentní se znakovou stránkou, jinak analyzátor hlásí chybu.
Obsah varbinary se považuje za stream kódových bodů, který se předá přímo analyzátoru XML. Proto musí dokument nebo fragment XML poskytnout bajtovou značku pořadí nebo jiné kódovací informace přímo vložené. Analyzátor se podívá pouze na datový proud a určí kódování. To znamená, že XML kódované ve formátu UTF-16 musí obsahovat BOM UTF-16, a instance bez BOM a bez uvedení kódování se interpretuje jako UTF-8.
Pokud kódování dokumentu XML není předem známo a data se předají jako řetězcová nebo binární data místo dat XML před přetypování do XML, měli byste s daty zacházet jako s varbinární. Například při čtení dat ze souboru XML pomocí OpenRowset()
byste měli zadat data, která se mají číst ve formátu hodnoty varbinary(max).
SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);
SQL Server interně představuje XML v efektivní binární reprezentaci, která používá kódování UTF-16. Kódování poskytované uživatelem se nezachová, ale je bráno v úvahu během procesu parsování.
Přetypování uživatelsky definovaných typů CLR
Pokud má uživatelem definovaný typ CLR serializaci XML, instance tohoto typu mohou být explicitně přetypované na datový typ XML. Další informace o serializaci XML uživatelem definovaného typu CLR naleznete v tématu XML Serializace z objektů databáze CLR.
Zpracování prázdných znaků v zadaném XML
V SQL Serveru se prázdné znaky uvnitř obsahu elementu ignorují, pokud se vyskytuje v posloupnosti prázdných znaků oddělených značkami, jako jsou počáteční nebo koncové značky, a není entitizována. (CDATA
oddíly jsou ignorovány.) Toto zpracování prázdných znaků se liší od toho, jak se prázdné znaky popisují ve specifikaci XML 1.0 publikované konsorciem W3C (World Wide Web Consortium). Důvodem je, že analyzátor XML v SQL Serveru rozpozná pouze omezený počet podmnožin DTD, jak je definováno v XML 1.0. Další informace o omezených podmnožinách DTD podporovaných v SQL Serveru naleznete v tématu CAST a CONVERT.
Analyzátor XML ve výchozím nastavení zahodí nevýznamné prázdné znaky při převodu řetězcových dat na XML, pokud je splněna některé z následujících možností:
Atribut
xml:space
není definován na elementu nebo jeho nadřazených prvcích.Atribut
xml:space
, který má vliv na prvek nebo některý z jeho nadřazených prvků, má hodnotu výchozí.
Například:
DECLARE @x XML;
SET @x = '<root> <child/> </root>';
SELECT @x;
Tady je soubor výsledků.
<root><child/></root>
Toto chování ale můžete změnit. Pokud chcete zachovat bílá místa pro instanci DT XML, použijte operátor CONVERT
a jeho volitelný parametr stylu nastavený na hodnotu 1. Například:
SELECT CONVERT(XML, N'<root> <child/> </root>', 1);
Pokud se parametr stylu buď nepoužívá, nebo je jeho hodnota nastavená na 0
, nevýznamné prázdné znaky se pro převod xml instance DT nezachovají. Další informace o použití operátoru CONVERT
a jeho stylu parametr při převodu řetězcových dat na instance XML DT naleznete v tématu CAST a CONVERT.
Příklad: Přetypování řetězcové hodnoty na typ XML a jeho přiřazení ke sloupci
Následující příklad přetypuje řetězcovou proměnnou obsahující fragment XML na datový typ xml a uloží ji do sloupce 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>';
Následující operace vložení implicitně převede řetězec na typ xml.
INSERT INTO T
VALUES (3, @s);
Řetězec můžete explicitně CAST
typu xml:
INSERT INTO T
VALUES (3, CAST(@s AS XML));
Nebo můžete použít CONVERT
, jak je znázorněno v následující ukázce kódu:
INSERT INTO T
VALUES (3, CONVERT(XML, @s));
Příklad: Převedení řetězce na typ XML a jeho přiřazení k proměnné
V následujícím příkladu je řetězec převeden na xml typ a přiřazen k proměnné xml datového typu:
DECLARE @x XML;
DECLARE @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);
SELECT @x;
Použití příkazu SELECT s klauzulí FOR XML
Pomocí klauzule FOR XML
v příkazu SELECT
můžete vrátit výsledky jako XML. Například:
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT Column1, Column2
FROM Table1, Table2
WHERE <some_condition>
FOR XML AUTO
)
...;
Příkaz SELECT
vrátí textový fragment XML, který se pak parsuje během přiřazení proměnné datového typu xml.
Můžete také použít direktivu TYPE v dotazech FOR XML v klauzuli FOR XML
, která přímo vrátí výsledek dotazu FOR XML
jako xml typ:
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID = 19
FOR XML AUTO, TYPE
);
SELECT @xmlDoc;
Tady je výsledková sada.
<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...
V následujícím příkladu je výsledek dotazu FOR XML
, který je zadaný jako xml, vložen do sloupce 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
Další informace o FOR XML
naleznete v tématu FOR XML (SQL Server).
Poznámka
SQL Server vrátí klientovi instance datového typu xml v důsledku různých konstruktorů serveru, jako jsou FOR XML
dotazy, které používají direktivu TYPE
nebo kde xml datový typ se používá k vrácení XML ze sloupců, proměnných a výstupních parametrů databázového stroje SQL Serveru. V kódu klientské aplikace ADO.NET poskytovatel požaduje, aby tyto xml informace o datovém typu byla odeslána ze serveru v binárním kódování. Pokud ale používáte FOR XML
bez direktivy TYPE
, data XML se vrátí jako typ řetězce. V každém případě bude zprostředkovatel klienta vždy schopen zpracovat jakoukoli formu XML.
Použití konstantních přiřazení
Řetězcovou konstantu lze použít, pokud se očekává instance xml datového typu. Toto přiřazení je stejné jako implicitní přiřazení řetězce CAST
do XML. Například:
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/>';
Předchozí příklad implicitně převede řetězec na datový typ xml a přiřadí ho proměnné typu xml.
Následující příklad vloží konstantní řetězec do sloupce typu xml:
CREATE TABLE T (
c1 INT PRIMARY KEY,
c2 XML
);
INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');
Poznámka
Pro typ XML je XML ověřen proti zadanému schématu. Další informace naleznete v části Porovnání typované XML s netypovaným XML.
Použití hromadného načtení
Vylepšené funkce OPENROWSET umožňují hromadně načítat dokumenty XML do databáze. Můžete hromadně načíst instance XML ze souborů do sloupců typu xml v databázi. Pracovní ukázky najdete v tématu Příklady hromadného importu a exportu dokumentů XML (SQL Server). Další informace o načítání dokumentů XML naleznete v tématu Načtení dat XML.
V této části
Článek | Popis |
---|---|
možnosti dotazu XML a zachování dat | Popisuje části instancí XML, které se nezachovají, když jsou uložené v databázích. |