다음을 통해 공유


기본 제공 XML 스키마 컬렉션(sys)

사용자가 만드는 모든 데이터베이스의 sys 관계형 스키마에는 미리 정의된 sys XML 스키마 컬렉션이 있습니다. 이 스키마 컬렉션에는 이러한 미리 정의된 스키마가 포함되며 사용자가 만든 다른 XML 스키마 컬렉션으로부터 이러한 스키마를 액세스할 수 있습니다. 이러한 미리 정의된 스키마에 사용되는 접두사는 XQuery에서 의미를 갖습니다. 예약된 접두사는 xml 뿐입니다.

xml = http://www.w3.org/XML/1998/namespace
xs = http://www.w3.org/2001/XMLSchema
xsi = http://www.w3.org/2001/XMLSchema-instance
fn = http://www.w3.org/2004/07/xpath-functions
sqltypes = https://schemas.microsoft.com/sqlserver/2004/sqltypes
xdt = http://www.w3.org/2004/07/xpath-datatypes
(no prefix) = urn:schemas-microsoft-com:xml-sql
(no prefix) = https://schemas.microsoft.com/sqlserver/2004/SOAP

sqltypes 네임스페이스에는 사용자가 만든 모든 XML 스키마 컬렉션에서 참조할 수 있는 구성 요소가 포함됩니다. Microsoft 웹 사이트에서 sqltypes 스키마를 다운로드할 수 있습니다. 기본 제공되는 구성 요소는 다음과 같습니다.

  • XSD 유형

  • lang, basespace XML 특성

  • sqltypes 네임스페이스의 구성 요소

다음 쿼리는 사용자가 만든 XML 스키마 컬렉션에서 참조할 수 있는 기본 제공 구성 요소를 반환합니다.

SELECT C.name, N.name, C.symbol_space_desc from sys.xml_schema_components C join sys.xml_schema_namespaces N
on ((C.xml_namespace_id = N.xml_namespace_id) AND (C.xml_collection_id = N.xml_collection_id))
join sys.xml_schema_collections SC
on SC.xml_collection_id = C.xml_collection_id
where ((C.xml_collection_id = 1) AND (C.name is not null) AND (C.scoping_xml_component_id is null) 
AND (SC.schema_id = 4))
GO

다음 예에서는 사용자 스키마에서 이러한 구성 요소를 참조하는 방법을 보여 줍니다. CREATE XML SCHEMA COLLECTION은 sqltypes 네임스페이스에 정의된 varchar 유형을 참조하는 XML 스키마 컬렉션을 만듭니다. 또한 xml 네임스페이스에 정의된 lang 특성을 참조합니다.

CREATE XML SCHEMA COLLECTION SC AS '
<schema 
   xmlns="http://www.w3.org/2001/XMLSchema" 
   targetNamespace="myNS"
   xmlns:ns="myNS"
   xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes" > 
   <import namespace="http://www.w3.org/XML/1998/namespace"/>
   <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
   <element name="root">
      <complexType>
          <sequence>
             <element name="a" type="string"/>
             <element name="b" type="string"/>
             <!-- varchar type is defined in the sys.sys collection and 
                  can be referenced in any user-defined schema -->
             <element name="c" type="s:varchar"/>
          </sequence>
          <attribute name="att" type="int"/>
          <!-- xml:lang attribute is defined in the sys.sys collection 
               and can be referenced in any user-defined schema -->
          <attribute ref="xml:lang"/>
      </complexType>
    </element>
 </schema>'
GO
 -- Cleanup
DROP xml schema collection SC 
GO

다음 사항에 유념하십시오.

  • 사용자 정의 XML 스키마 컬렉션에 있는 이러한 네임스페이스의 XML 스키마는 수정할 수 없습니다. 예를 들어 다음 XML 스키마 컬렉션은 보호되는 sqltypes 네임스페이스에 구성 요소를 추가하기 때문에 오류가 발생합니다.

    CREATE XML SCHEMA COLLECTION SC AS '
    <schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace  
        ="https://schemas.microsoft.com/sqlserver/2004/sqltypes" > 
          <element name="root" type="string"/>
    </schema>'
    GO
    
  • sys XML 스키마 컬렉션을 사용하여 xml 열, 변수 또는 매개 변수를 형식화할 수 없습니다. 예를 들어 다음 코드는 오류를 반환합니다.

    DECLARE @x xml (sys.sys)
    
  • 이러한 기본 제공 스키마의 직렬화는 지원되지 않습니다. 예를 들어 다음 코드는 오류를 반환합니다.

    SELECT XML_SCHEMA_NAMESPACE(N'sys',N'sys')
    GO
    

다음 코드는 sqltypes 네임스페이스에 정의된 varchar 유형을 사용하는 XML 스키마 컬렉션을 만듭니다.

CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="myNS" xmlns:ns="myNS"
        xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
   <import   
     namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
      <simpleType name="myType">
            <restriction base="s:varchar">
                  <maxLength value="20"/>
            </restriction>
      </simpleType>
      <element name="root" type="ns:myType"/>
</schema>'
go

다음과 같이 형식화된 XML 변수를 만들고, 여기에 XML 인스턴스를 지정한 다음 <root> 요소 유형의 값이 varchar 유형인지 확인할 수 있습니다.

DECLARE @var XML(SC)
SET @var = '<root xmlns="myNS">My data</root>'
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";
declare namespace ns="myNS"; 
data(/ns:root[1]) instance of sqltypes:varchar?')
GO

instance of sqltypes:varchar? 식은 <root> 요소 값이 @var 변수와 연결된 스키마에 따라 varchar로부터 파생된 유형이기 때문에 TRUE를 반환합니다.