Udostępnij za pomocą


UTWÓRZ KOLEKCJĘ SCHEMATÓW XML (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Importuje składniki schematu do bazy danych.

Transact-SQL konwencje składni

Składnia

CREATE XML SCHEMA COLLECTION [ <relational_schema>. ] sql_identifier AS Expression

Arguments

relational_schema

Identyfikuje nazwę schematu relacyjnego. Jeśli nie zostanie określony, przyjmuje się domyślny schemat relacyjny.

sql_identifier

Identyfikator SQL kolekcji schematów XML.

Wyrażenie

Stała lub zmienna skalarna ciągu. Jest typu varchar, varbinary, nvarchar lub xml .

Uwagi

Możesz również dodać nowe przestrzenie nazw do kolekcji lub dodać nowe składniki do istniejących przestrzeni nazw w kolekcji przy użyciu kolekcji ALTER XML SCHEMA COLLECTION.

Aby usunąć kolekcje, użyj kolekcji DROP XML SCHEMA COLLECTION.

Permissions

Aby utworzyć kolekcję SCHEMATÓW XML, wymagane jest co najmniej jeden z następujących zestawów uprawnień:

  • CONTROL uprawnienia na serwerze
  • ALTER ANY DATABASE uprawnienia na serwerze
  • ALTER uprawnienia do bazy danych
  • CONTROL uprawnienia w bazie danych
  • ALTER ANY SCHEMA uprawnienia i CREATE XML SCHEMA COLLECTION uprawnienia w bazie danych
  • ALTER lub CONTROL uprawnienia do schematu relacyjnego i CREATE XML SCHEMA COLLECTION uprawnienia w bazie danych

Przykłady

A. Tworzenie kolekcji schematów XML w bazie danych

Poniższy przykład tworzy kolekcję ManuInstructionsSchemaCollectionschematów XML . Kolekcja ma tylko jedną przestrzeń nazw schematu.

-- Create a sample database in which to load the XML schema collection.
CREATE DATABASE SampleDB;
GO

USE SampleDB;
GO

CREATE XML SCHEMA COLLECTION ManuInstructionsSchemaCollection
    AS N'<?xml version="1.0" encoding="UTF-16"?>
<xsd:schema targetNamespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   xmlns          ="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   elementFormDefault="qualified"
   attributeFormDefault="unqualified"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" >

    <xsd:complexType name="StepType" mixed="true" >
        <xsd:choice  minOccurs="0" maxOccurs="unbounded" >
            <xsd:element name="tool" type="xsd:string" />
            <xsd:element name="material" type="xsd:string" />
            <xsd:element name="blueprint" type="xsd:string" />
            <xsd:element name="specs" type="xsd:string" />
            <xsd:element name="diag" type="xsd:string" />
        </xsd:choice>
    </xsd:complexType>

    <xsd:element  name="root">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:element name="Location" minOccurs="1" maxOccurs="unbounded">
                    <xsd:complexType mixed="true">
                        <xsd:sequence>
                            <xsd:element name="step" type="StepType" minOccurs="1" maxOccurs="unbounded" />
                        </xsd:sequence>
                        <xsd:attribute name="LocationID" type="xsd:integer" use="required"/>
                        <xsd:attribute name="SetupHours" type="xsd:decimal" use="optional"/>
                        <xsd:attribute name="MachineHours" type="xsd:decimal" use="optional"/>
                        <xsd:attribute name="LaborHours" type="xsd:decimal" use="optional"/>
                        <xsd:attribute name="LotSize" type="xsd:decimal" use="optional"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>';
GO

-- Verify - list of collections in the database.
SELECT *
FROM sys.xml_schema_collections;

-- Verify - list of namespaces in the database.
SELECT name
FROM sys.xml_schema_namespaces;

-- Use it. Create a typed xml variable. Note collection name specified.
DECLARE @x AS XML(ManuInstructionsSchemaCollection);
GO

--Or create a typed xml column.
CREATE TABLE T
(
    i INT PRIMARY KEY,
    x XML(ManuInstructionsSchemaCollection)
);
GO

-- Clean up
DROP TABLE T;
GO

DROP XML SCHEMA COLLECTION ManuInstructionsSchemaCollection;
GO

USE master;
GO

DROP DATABASE SampleDB;

Alternatywnie możesz przypisać kolekcję schematów do zmiennej i określić zmienną w instrukcji CREATE XML SCHEMA COLLECTION w następujący sposób:

DECLARE @MySchemaCollection AS NVARCHAR (MAX);

SET @MySchemaCollection = N' copy the schema collection here';

CREATE XML SCHEMA COLLECTION MyCollection
    AS @MySchemaCollection;

Zmienna w przykładzie jest nvarchar(max) typu. Zmienna może być również typem danych XML , w tym przypadku jest niejawnie konwertowana na ciąg.

Aby uzyskać więcej informacji, zobacz Wyświetlanie przechowywanej kolekcji schematów XML.

Kolekcje schematów można przechowywać w kolumnie typu xml . W tym przypadku, aby utworzyć kolekcję schematów XML, wykonaj następujące kroki:

  1. Pobierz kolekcję schematów z kolumny przy użyciu SELECT instrukcji i przypisz ją do zmiennej typu xml lub typu varchar .

  2. Określ nazwę zmiennej w instrukcji CREATE XML SCHEMA COLLECTION .

Przechowuje CREATE XML SCHEMA COLLECTION tylko składniki schematu, które rozumie program SQL Server. Wszystkie elementy w schemacie XML nie są przechowywane w bazie danych. W związku z tym, jeśli chcesz, aby kolekcja schematów XML była dokładnie tak, jak została dostarczona, należy zapisać schematy XML w kolumnie bazy danych lub w innym folderze na komputerze.

B. Określanie wielu przestrzeni nazw schematu w kolekcji schematów

Podczas tworzenia kolekcji schematów XML można określić wiele schematów XML. Przykład:

CREATE XML SCHEMA COLLECTION MyCollection
    AS N'
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Contents of schema here -->
</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Contents of schema here -->
</xsd:schema>';

Poniższy przykład tworzy kolekcję ProductDescriptionSchemaCollection schematów XML zawierającą dwie przestrzenie nazw schematu XML.

CREATE XML SCHEMA COLLECTION ProductDescriptionSchemaCollection
    AS '<xsd:schema targetNamespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"
    xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"
    elementFormDefault="qualified"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
    <xsd:element name="Warranty"  >
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="WarrantyPeriod" type="xsd:string"  />
                <xsd:element name="Description" type="xsd:string"  />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
 <xs:schema targetNamespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
    xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
    elementFormDefault="qualified"
    xmlns:mstns="https://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain" >
    <xs:import
namespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain" />
    <xs:element name="ProductDescription" type="ProductDescription" />
        <xs:complexType name="ProductDescription">
            <xs:sequence>
                <xs:element name="Summary" type="Summary" minOccurs="0" />
            </xs:sequence>
            <xs:attribute name="ProductModelID" type="xs:string" />
            <xs:attribute name="ProductModelName" type="xs:string" />
        </xs:complexType>
        <xs:complexType name="Summary" mixed="true" >
            <xs:sequence>
                <xs:any processContents="skip" namespace="http://www.w3.org/1999/xhtml" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
</xs:schema>';
GO

-- Clean up
DROP XML SCHEMA COLLECTION ProductDescriptionSchemaCollection;
GO

C. Importowanie schematu, który nie określa docelowej przestrzeni nazw

Jeśli schemat, który nie zawiera atrybutu targetNamespace , zostanie zaimportowany do kolekcji, jego składniki są skojarzone z pustą przestrzenią nazw docelową ciągu, jak pokazano w poniższym przykładzie. Skojarzenie co najmniej jednego schematu zaimportowanego w kolekcji powoduje skojarzenie wielu składników schematu (potencjalnie niepowiązanych) z domyślną pustą przestrzenią nazw ciągów.

-- Create a collection that contains a schema with no target namespace.
CREATE XML SCHEMA COLLECTION MySampleCollection
    AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema"  xmlns:ns="http://ns">
<element name="e" type="dateTime"/>
</schema>';
GO

-- Query will return the names of all the collections that
--contain a schema with no target namespace.
SELECT sys.xml_schema_collections.name
FROM sys.xml_schema_collections
     INNER JOIN sys.xml_schema_namespaces
         ON sys.xml_schema_collections.xml_collection_id = sys.xml_schema_namespaces.xml_collection_id
WHERE sys.xml_schema_namespaces.name = '';

D. Używanie kolekcji schematów XML i partii

Nie można odwołać się do kolekcji schematów w tej samej partii, w której została utworzona. Jeśli spróbujesz odwołać się do kolekcji w tej samej partii, w której została utworzona, zostanie wyświetlony błąd informujący, że kolekcja nie istnieje. Poniższy przykład działa; Jeśli jednak usuniesz GO i dlatego spróbujesz odwołać się do kolekcji schematów XML, aby wpisać zmienną XML w tej samej partii, zwraca błąd.

CREATE XML SCHEMA COLLECTION mySC
    AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
      <element name="root" type="string"/>
</schema>
';
GO

CREATE TABLE T
(
    Col1 XML(mySC)
);
GO