Jämför inskriven XML med otypad XML
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Du kan skapa variabler, parametrar och kolumner av XML- typ. Du kan också associera en samling XML-scheman med en variabel, parameter eller kolumn med XML- typ. I det här fallet kallas instansen XML--datatyp typad. Annars kallas XML-instansen utan typ.
Välformulerad XML och XML-datatypen
Datatypen xml implementerar datatypen ISO-standard xml. Därför kan den lagra välformade XML-version 1.0-dokument och även så kallade XML-innehållsfragment med textnoder och ett godtyckligt antal element på den översta nivån i en otypad XML-kolumn. Systemet kontrollerar att data är välformulerade, kräver inte att kolumnen är bunden till XML-scheman och avvisar data som inte är välformulerade i utökad mening. Detta gäller även för otypade XML-variabler och parametrar.
XML-scheman
Ett XML-schema innehåller följande:
Verifieringsbegränsningar. När en typinstans av XML tilldelas eller ändras verifierar SQL Server instansen.
Information om datatyp. Scheman innehåller information om typerna av attribut och element i instansen xml- datatyp. Typinformationen ger mer exakt driftssemantik till värdena i instansen än vad som är möjligt med otypade xml-. Till exempel kan decimala aritmetiska åtgärder utföras på ett decimalvärde, men inte på ett strängvärde. På grund av detta kan skrivet XML-lagring göras betydligt mer kompakt än otypad XML.
Välja inskriven eller otypad XML
Använd otypade xml- datatyp i följande situationer:
Du har inget schema för dina XML-data.
Du har scheman, men du vill inte att servern ska verifiera data. Detta är ibland fallet när ett program utför validering på klientsidan innan data lagras på servern, eller tillfälligt lagrar XML-data som är ogiltiga enligt schemat, eller använder schemakomponenter som inte stöds på servern.
Använd den angivna XML--datatypen i följande situationer:
Du har scheman för DINA XML-data och du vill att servern ska verifiera dina XML-data enligt XML-scheman.
Du vill dra nytta av lagrings- och frågeoptimeringar baserat på typinformation.
Du vill dra bättre nytta av typinformation vid kompilering av dina frågor.
Inskrivna XML-kolumner, parametrar och variabler kan lagra XML-dokument eller -innehåll. Du måste dock ange med en flagga om du lagrar ett dokument eller innehåll vid tidpunkten för deklarationen. Dessutom måste du ange samlingen med XML-scheman. Ange DOKUMENT om varje XML-instans har exakt ett element på den översta nivån. Annars använder du CONTENT. Frågekompilatorn använder DOCUMENT-flaggan i typkontroller vid frågekompilering för att härleda singleton-element på den översta nivån.
Skapa skrivet XML
Innan du kan skapa inskrivna xml- variabler, parametrar eller kolumner måste du först registrera XML-schemasamlingen med hjälp av CREATE XML SCHEMA COLLECTION (Transact-SQL). Du kan sedan associera XML-schemasamlingen med variabler, parametrar eller kolumner i xml- datatyp.
I följande exempel används en namngivningskonvention i två delar för att ange XML-schemasamlingens namn. Den första delen är schemanamnet och den andra delen är XML-schemasamlingens namn.
Exempel: Associera en schemasamling med en XML-typvariabel
I följande exempel skapas en xml- typvariabel och associerar en schemasamling med den. Schemasamlingen som anges i exemplet har redan importerats i databasen AdventureWorks.
DECLARE @x xml (Production.ProductDescriptionSchemaCollection);
Exempel: Ange ett schema för en xml-typkolumn
I följande exempel skapas en tabell med en xml- typkolumn och anger ett schema för kolumnen:
CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));
Exempel: Skicka en XML-typparameter till en lagrad procedur
I följande exempel skickas en xml- typparameter till en lagrad procedur och anger ett schema för variabeln:
CREATE PROCEDURE SampleProc
@ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...
Observera följande om XML-schemasamlingen:
En XML-schemasamling är endast tillgänglig i databasen där den registrerades med hjälp av Skapa en XML-schemasamling.
Om du castar från en sträng till en skriven xml- datatyp utför parsningen även validering och typning, baserat på XML-schemanamnrymderna i den angivna samlingen.
Du kan casta från en typad XML--datatyp till en otypad XML--datatyp och vice versa.
Mer information om andra sätt att generera XML i SQL Server finns i Skapa instanser av XML-data. När XML har genererats kan den tilldelas antingen till en XML- datatypvariabel eller lagras i xml- typkolumner för ytterligare bearbetning.
I datatypshierarkin visas xml- datatyp nedan sql_variant och användardefinierade typer, men över någon av de inbyggda typerna.
Exempel: Ange fasetter för att begränsa en typ av XML-kolumn
För inskrivna XML- kolumner kan du begränsa kolumnen så att endast enskilda element på den översta nivån tillåts för varje instans som lagras i den. Du gör detta genom att ange den valfria DOCUMENT
-fasett när en tabell skapas, som visas i följande exempel.
CREATE TABLE T(Col1 xml
(DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO
Som standard lagras instanser som lagras i den inskrivna XML--kolumnen som XML-innehåll och inte som XML-dokument. På så sätt kan du göra följande:
Noll eller många element på den översta nivån
Textnoder i element på den översta nivån
Du kan också uttryckligen ange det här beteendet genom att lägga till CONTENT
fasett, som visas i följande exempel:
CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default
Du kan ange valfria DOCUMENT/CONTENT-fasetter var som helst där du definierar XML- typ (typ av XML). När du till exempel skapar en skriven xml- variabel kan du lägga till fasetter för DOKUMENT/INNEHÅLL enligt följande:
declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);
Definition av dokumenttyp (DTD)
XML- datatypskolumner, variabler och parametrar kan skrivas med hjälp av XML-schema, men inte med hjälp av DTD. Infogad DTD kan dock användas för både otypad och typad XML för att ange standardvärden och för att ersätta entitetsreferenser med deras utökade formulär.
Du kan konvertera DTD:er till XML-schemadokument med hjälp av verktyg från tredje part och läsa in XML-scheman i databasen.
Uppgradera skriven XML från SQL Server 2005
SQL Server 2008 (10.0.x) har gjort flera tillägg till XML-schemastöd, inklusive stöd för slapp validering, förbättrad hantering av xs:date, xs:time och xs:dateTime instansdata och lagt till stöd för list- och unionstyper. I de flesta fall påverkar ändringarna inte uppgraderingsupplevelsen. Men om du använde en XML-schemasamling i SQL Server 2005 (9.x) som tillät värden av typen xs:date, xs:timeeller xs:dateTime (eller någon undertyp) sker följande uppgraderingssteg när du kopplar SQL Server 2005 (9.x) till en senare version av SQL Server:
För varje XML-kolumn, som skrivs med en XML-schemasamling som innehåller element eller attribut som skrivs som antingen xs:anyType, xs:anySimpleType, xs:date eller någon av dess undertyper, xs:time eller någon undertyp av detta, eller xs:dateTime eller någon av dess undertyper, eller är union- eller listtyper som innehåller någon av dessa typer inträffar följande:
Alla XML-index i kolumnen inaktiveras.
Alla SQL Server 2005-värden (9.x) fortsätter att representeras i Z-tidszonen eftersom de har normaliserats till Z-tidszonen.
Alla xs:date eller xs:dateTime värden som är mindre än 1 januari i år 1 leder till ett körningsfel när indexet återskapas eller en XQuery- eller XML-DML-instruktioner körs mot XML- datatyp som innehåller det värdet.
Eventuella negativa år i xs:date eller xs:dateTime fasetter eller standardvärden i en XML-schemasamling uppdateras automatiskt till det minsta värde som tillåts av basvärdet xs:date eller xs:dateTime typ (till exempel 0001-01-01T00:00:00.0000000Z för xs:dateTime).
Du kan fortfarande använda en Transact-SQL SELECT-instruktion för att hämta hela xml- datatyp, även om den innehåller negativa år. Vi rekommenderar att du ersätter negativa år med ett år inom det nyligen stödda intervallet eller ändrar typen av element eller attribut till xs:string.