Integrierte XML-Schemaauflistung (sys)
Jede Datenbank, die Sie erstellen, besitzt eine vordefinierte XML sys-Schemaauflistung im relationalen sys-Schema. Es reserviert diese vordefinierten Schemas, und der Zugriff darauf kann aus einer beliebigen, von einem Benutzer erstellten XML-Schemaauflistung erfolgen. Die in diesen vordefinierten Schemas verwendeten Präfixe sind in XQuery von Bedeutung. Nur xml ist ein reserviertes Präfix.
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
Beachten Sie, dass der sqltypes-Namespace Komponenten enthält, auf die aus jeder beliebigen, von einem Benutzer erstellten XML-Schemaauflistung verwiesen werden kann. Sie können das sqltypes-Schema von dieser Microsoft-Website herunterladen. Die folgenden Komponenten sind z. B. integriert:
XSD-Typen
Die XML-Attribute lang, base und space
Komponenten des sqltypes-Namespace
Die folgende Abfrage gibt integrierte Komponenten zurück, auf die aus einer von einem Benutzer erstellten XML-Schemaauflistung verwiesen werden kann:
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
Das folgende Beispiel zeigt, wie auf diese Komponenten in einem Benutzerschema verwiesen wird. CREATE XML SCHEMA COLLECTION erstellt eine XML-Schemaauflistung, die auf den varchar-Datentyp verweist, der im sqltypes-Namespace definiert wurde. Das Beispiel verweist außerdem auf das lang-Attribut, das im xml-Namespace definiert wurde.
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
Beachten Sie Folgendes:
Sie können keine XML-Schemas mit diesen Namespaces in benutzerdefinierten XML-Schemaauflistungen ändern. Die folgende XML-Schemaauflistung verursacht einen Fehler, weil dem geschützten Namespace sqltypes eine Komponente hinzugefügt wird:
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
Sie können die XML-Schemaauflistung sys nicht zum Typisieren von Spalten, Variablen oder Parametern von xml verwenden. So gibt z. B. der folgende Code einen Fehler zurück:
DECLARE @x xml (sys.sys)
Die Serialisierung dieser integrierten Schemas wird nicht unterstützt. So gibt z. B. der folgende Code einen Fehler zurück:
SELECT XML_SCHEMA_NAMESPACE(N'sys',N'sys') GO
Auch mit dem Code im folgenden Beispiel wird eine XML-Schemaauflistung erstellt, die den varchar-Datentyp verwendet, der im sqltypes-Namespace definiert wurde:
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
Wie das folgende Beispiel zeigt, können Sie eine typisierte XML-Variable erstellen, dieser eine XML-Instanz zuweisen und dann überprüfen, ob der Wert des <root>-Elementtyps vom Typ varchar ist.
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
Der instance of sqltypes:varchar? -Ausdruck gibt TRUE zurück, weil der Wert des <root>-Elements einem Typ entspricht, der gemäß dem Schema, das der @var-Variablen zugeordnet ist, von varchar abgeleitet wurde.