적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 데이터베이스
스키마 구성 요소를 데이터베이스로 가져옵니다.
구문
CREATE XML SCHEMA COLLECTION [ <relational_schema>. ] sql_identifier AS Expression
인수
relational_schema
관계형 스키마 이름을 식별합니다. 지정하지 않으면 기본 관계형 스키마가 사용됩니다.
sql_identifier
XML 스키마 컬렉션의 SQL 식별자입니다.
식
문자열 상수 또는 스칼라 변수입니다. varchar, varbinary, nvarchar 또는 xml 유형입니다.
설명
ALTER XML SCHEMA COLLECTION을 사용하여 컬렉션에 있는 기존 네임스페이스에 새 구성 요소를 추가하거나 컬렉션에 새 네임스페이스를 추가할 수도 있습니다.
컬렉션을 제거하려면 DROP XML SCHEMA COLLECTION을 사용합니다.
사용 권한
XML SCHEMA COLLECTION을 만들려면 다음 사용 권한이 하나 이상 필요합니다.
-
CONTROL서버에 대한 사용 권한 -
ALTER ANY DATABASE서버에 대한 사용 권한 -
ALTER데이터베이스에 대한 사용 권한 -
CONTROL데이터베이스의 사용 권한 -
ALTER ANY SCHEMA데이터베이스의 사용 권한 및CREATE XML SCHEMA COLLECTION사용 권한 -
ALTER또는CONTROL데이터베이스의 관계형 스키마 및CREATE XML SCHEMA COLLECTION사용 권한에 대한 사용 권한
예제
A. 데이터베이스에서 XML 스키마 컬렉션 만들기
다음 예에서는 XML 스키마 컬렉션 ManuInstructionsSchemaCollection을 만듭니다. 이 컬렉션에는 스키마 네임스페이스가 하나만 있습니다.
-- 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;
또는 다음과 같이 변수에 스키마 컬렉션을 할당하고 CREATE XML SCHEMA COLLECTION 문에 변수를 지정할 수 있습니다.
DECLARE @MySchemaCollection AS NVARCHAR (MAX);
SET @MySchemaCollection = N' copy the schema collection here';
CREATE XML SCHEMA COLLECTION MyCollection
AS @MySchemaCollection;
이 예에서 변수는 nvarchar(max) 형식입니다. 변수는 xml 데이터 형식일 수도 있습니다. 이 경우 문자열로 암시적으로 변환됩니다.
자세한 내용은 저장된 XML 스키마 컬렉션 보기를 참조하세요.
xml 형식 열에 스키마 컬렉션을 저장할 수 있습니다. 이 경우 XML 스키마 컬렉션을 만들려면 다음 단계를 수행합니다.
문을 사용하여
SELECT열에서 스키마 컬렉션을 검색하고 xml 형식 또는 varchar 형식의 변수에 할당합니다.문에서 변수 이름을 지정합니다
CREATE XML SCHEMA COLLECTION.
SQL CREATE XML SCHEMA COLLECTION Server에서 이해하는 스키마 구성 요소만 저장합니다. XML 스키마의 모든 구성 요소는 데이터베이스에 저장되지 않습니다. 따라서 XML 스키마 컬렉션을 제공된 대로 정확하게 되돌리려면 XML 스키마를 데이터베이스 열이나 컴퓨터의 다른 폴더에 저장해야 합니다.
B. 스키마 컬렉션에서 여러 스키마 네임스페이스 지정
XML 스키마 컬렉션을 만들 때 XML 스키마를 여러 개 지정할 수 있습니다. 예를 들면 다음과 같습니다.
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>';
다음 예에서는 두 개의 XML 스키마 네임스페이스를 포함하는 XML 스키마 컬렉션 ProductDescriptionSchemaCollection을 만듭니다.
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. 대상 네임스페이스를 지정하지 않는 스키마 가져오기
특성을 포함하지 targetNamespace 않는 스키마를 컬렉션에서 가져오는 경우 해당 구성 요소는 다음 예제와 같이 빈 문자열 대상 네임스페이스와 연결됩니다. 컬렉션에서 가져온 하나 이상의 스키마를 연결하지 않으면 여러 스키마 구성 요소(잠재적으로 관련이 없음)가 기본 빈 문자열 네임스페이스와 연결됩니다.
-- 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. XML 스키마 컬렉션 및 일괄 처리 사용
스키마 컬렉션을 만든 동일한 일괄 처리에서 참조할 수 없습니다. 컬렉션을 만든 동일한 일괄 처리에서 참조하려고 하면 컬렉션이 존재하지 않는다는 오류가 발생합니다. 다음 예제는 작동합니다. 그러나 제거 GO 하면 XML 스키마 컬렉션을 참조하여 동일한 일괄 처리에 XML 변수를 입력하려고 하면 오류가 반환됩니다.
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