Fare riferimento alla raccolta di schemi XML predefinita (sys)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Per ogni database creato è disponibile una raccolta di XML Schema sys predefinita nello schema relazionale sys . Tale raccolta riserva questi schemi predefiniti, ai quali è possibile accedere da qualsiasi altra raccolta XML Schema creata dall'utente. I prefissi utilizzati negli schemi predefiniti sono significativi in XQuery. L'unico prefisso riservato è 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

Lo spazio dei nomi sqltypes contiene componenti ai quali è possibile fare riferimento da qualsiasi raccolta di schemi XML creata dall'utente. È possibile scaricare lo schema sqltypes da questo sito Web Microsoft. I componenti predefiniti sono:

  • I tipi XSD

  • Gli attributi XML lang, basee space

  • I componenti dello spazio dei nomi sqltypes

La query seguente restituisce i componenti predefiniti ai quali è possibile fare riferimento da una raccolta XML Schema creata dall'utente:

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

Nell'esempio seguente viene illustrato come viene fatto riferimento a tali componenti in uno schema utente. CREATE XML SCHEMA COLLECTION consente di creare una raccolta di XML Schema che fa riferimento al varchar tipo definito nello spazio dei nomi sqltypes . e inoltre all'attributo lang definito nello spazio dei nomi 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

Si noti quanto segue:

  • Non è possibile modificare gli schemi XML con questi spazi dei nomi in nessuna raccolta di schemi XML definita dall'utente. Ad esempio, la raccolta di schemi XML seguente genera un errore perché aggiunge un componente allo spazio dei nomi protetto 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
    
  • Non è possibile utilizzare la raccolta di schemi XML sys nelle colonne, variabili o parametri di tipo xml. Il codice seguente, ad esempio, restituisce un errore:

    DECLARE @x xml (sys.sys);
    
  • La serializzazione di questi schemi predefiniti non è supportata. Il codice seguente, ad esempio, restituisce un errore:

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

Il codice seguente rappresenta un altro esempio nel quale viene creata una raccolta XML Schema che utilizza il tipo varchar definito nello spazio dei nomi sqltypes :

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

Come illustrato nell'esempio seguente, è possibile creare una variabile XML tipizzata, assegnarvi un'istanza XML e verificare che il valore del tipo di elemento <root> corrisponda a un 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

L'espressione instance of sqltypes:varchar? restituisce TRUE, perché il valore dell'elemento <root> è di un tipo derivato da varchar in base allo schema associato alla variabile @var.

Vedi anche