CREATE XML SCHEMA COLLECTION (Transact-SQL)
Importa i componenti di schema in un database.
Convenzioni della sintassi Transact-SQL
Sintassi
CREATE XML SCHEMA COLLECTION [ <relational_schema>. ]sql_identifier AS Expression
Argomenti
relational_schema
Viene identificato il nome dello schema relazionale. Se viene omesso, viene utilizzato il nome di schema predefinito.sql_identifier
Identificatore SQL per la raccolta di XML Schema.Expression
Costante stringa o variabile scalare È di tipo varchar, varbinary, nvarchar o xml.
Osservazioni
È inoltre possibile aggiungere nuovi spazi dei nomi alla raccolta oppure nuovi componenti a spazi dei nomi esistenti nella raccolta mediante ALTER XML SCHEMA COLLECTION.
Per rimuovere le raccolte, utilizzare DROP XML SCHEMA COLLECTION (Transact-SQL).
Autorizzazioni
Per creare un'istruzione XML SCHEMA COLLECTION, è richiesto almeno uno dei set di autorizzazioni seguenti:
Autorizzazione CONTROL per il server
Autorizzazione ALTER ANY DATABASE per il server
Autorizzazione ALTER per il database
Autorizzazione CONTROL per il database
Autorizzazioni ALTER ANY SCHEMA e CREATE XML SCHEMA COLLECTION per il database
Autorizzazione ALTER o CONTROL per lo schema relazionale e autorizzazione CREATE XML SCHEMA COLLECTION per il database
Esempi
A.Creazione di una raccolta di XML Schema nel database
Nell'esempio corrente viene creata la raccolta di XML Schema ManuInstructionsSchemaCollection. La raccolta ha solo uno spazio dei nomi di schema.
-- 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 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
In alternativa, è possibile assegnare la raccolta di schemi a una variabile e specificare la variabile nell'istruzione CREATE XML SCHEMA COLLECTION nel modo descritto di seguito:
DECLARE @MySchemaCollection nvarchar(max)
Set @MySchemaCollection = N' copy the schema collection here'
CREATE XML SCHEMA COLLECTION MyCollection AS @MySchemaCollection
La variabile utilizzata nell'esempio è di tipo nvarchar(max). La variabile può inoltre essere di tipo xml e in questo caso viene convertita in modo implicito in stringa.
Per ulteriori informazioni, vedere Visualizzazione di una raccolta di XML Schema archiviata.
È possibile archiviare raccolte di schemi in una colonna di tipo xml. In questo caso, per creare una raccolta di XML Schema, procedere nel modo seguente:
Recuperare la raccolta di schemi dalla colonna tramite un'istruzione SELECT e assegnarla a una variabile di tipo xml o varchar.
Specificare il nome della variabile nell'istruzione CREATE XML SCHEMA COLLECTION.
L'istruzione CREATE XML SCHEMA COLLECTION archivia solo i componenti di schema supportati da SQL Server. Il contenuto dell'XML Schema non viene archiviato nel database. Pertanto, se si desidera una copia esatta della raccolta di XML Schema, è consigliabile salvare gli XML Schema in una colonna di database o in un'altra cartella nel computer.
B.Specifica di spazi dei nomi relativi a più schemi in una raccolta di schemi
È possibile specificare più XML Schema quando si crea una raccolta di XML Schema. Ad esempio:
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>'
Nell'esempio seguente viene creata la raccolta di XML Schema ProductDescriptionSchemaCollection che include spazi dei nomi relativi a due XML Schema.
CREATE XML SCHEMA COLLECTION ProductDescriptionSchemaCollection AS
'<xsd:schema targetNamespace="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"
xmlns="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
elementFormDefault="qualified"
xmlns:mstns="http://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.Importazione di uno schema che non consente di specificare uno spazio dei nomi di destinazione
Se uno schema che non contiene un attributo targetNamespace viene importato in una raccolta, i relativi componenti vengono associati allo spazio dei nomi di destinazione della stringa vuota come illustrato nell'esempio seguente. La mancata associazione di uno o più schemi importati nella raccolta comporta l'associazione di più componenti di schema (potenzialmente non correlati) allo spazio dei nomi a stringa vuota predefinito.
-- 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
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.Utilizzo di una raccolta di XML Schema e di batch
Non è possibile fare riferimento a una raccolta di schemi nello stesso batch in cui è stata creata. Se si cerca di fare riferimento a una raccolta nello stesso batch in cui è stata creata, verrà generato un errore indicante che la raccolta non esiste. L'esempio seguente funziona correttamente. Se, tuttavia, si rimuove GO e si cerca di creare un riferimento tra la raccolta di XML Schema e una variabile di tipo xml nello stesso batch, verrà generato un errore.
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
Vedere anche
Riferimento
ALTER XML SCHEMA COLLECTION (Transact-SQL)
DROP XML SCHEMA COLLECTION (Transact-SQL)
DROP XML SCHEMA COLLECTION (Transact-SQL)
Requisiti e limitazioni per l'utilizzo di raccolte di XML Schema nel server