Partilhar via


Referenciar a Coleção de Esquemas XML interna (sys)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Todo banco de dados que você cria tem uma coleção de esquema XML sys predefinido no esquema relacional sys . Ele reserva esses esquemas predefinidos que podem ser acessados de qualquer outra coleção de esquema XML criada pelo usuário. Os prefixos usados nesses esquemas predefinidos são significativos em XQuery. Apenas xml é um prefixo reservado.

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

O namespace sqltypes contém componentes que podem ser referenciados a partir de qualquer coleção de esquema XML criada pelo usuário. Você pode baixar o esquema sqltypes deste site da Microsoft. Os componentes internos incluem o seguinte:

  • Tipos XSD

  • Atributos XML lang, basee space

  • Componentes do namespace sqltypes

A consulta a seguir retorna componentes internos que podem ser referidos a partir de uma coleção de esquema 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

O exemplo a seguir mostra como esses componentes são referenciados em um esquema de usuário. CREATE XML SCHEMA COLLECTION cria uma coleção de esquemas XML que referencia o tipo varchar definido no namespace sqltypes . O exemplo também referencia o atributo lang que está definido no namespace 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="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

Você deve observar o seguinte:

  • Não é possível modificar esquemas XML com esses namespaces em nenhuma coleção de esquemas XML definida pelo usuário. Por exemplo, a seguinte coleção de esquemas XML falha porque adiciona um componente ao namespace protegido 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
    
  • Não é possível usar a coleção de esquemas XML sys para digitar colunas, variáveis ou parâmetros xml. Por exemplo, o seguinte código retorna um erro:

    DECLARE @x xml (sys.sys);
    
  • Não há suporte para serialização desses esquemas internos. Por exemplo, o seguinte código retorna um erro:

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

O código a seguir é outro exemplo no qual uma coleção de esquema XML que usa o tipo varchar definido no namespace sqltypes é criada:

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

Como mostrado a seguir, você pode criar uma variável XML tipada, atribuir uma instância XML a ela e verificar se o valor do tipo de elemento <root> é um tipo 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

A expressão instance of sqltypes:varchar? retorna TRUE, pois o valor do elemento <root> é de um tipo derivado de varchar de acordo com o esquema associado à variável @var.

Confira também