Datentypumwandlungen und die sql:datatype-Anmerkung (SQLXML 4.0)
In einem XSD-Schema gibt das xsd:type-Attribut den XSD-Datentyp eines Elements oder Attributs an. Wenn Daten anhand eines XSD-Schemas aus der Datenbank extrahiert werden, wird der angegebene Datentyp zur Formatierung der Daten verwendet.
Darüber hinaus können Sie neben dem XSD-Typ in einem Schema auch über die sql:datatype-Anmerkung einen Microsoft SQL Server-Datentyp angeben. Die Attribute xsd:type und sql:datatype steuern die Zuordnung zwischen XSD-Datentypen und SQL Server-Datentypen.
xsd:type-Attribut
Sie können das xsd:type-Attribut verwenden, um den XML-Datentyp eines Attributs oder Elements anzugeben, das einer Spalte zugeordnet ist. xsd:type wirkt sich auf das vom Server zurückgegebene Dokument sowie auf die ausgeführte XPath-Abfrage aus. Wenn eine XPath-Abfrage für ein Zuordnungsschema ausgeführt wird, das xsd:type enthält, verwendet XPath den angegebenen Datentyp beim Verarbeiten der Abfrage. Weitere Informationen dazu, wie XPath xsd:type verwendet, finden Sie unter Zuordnen von XSD-Datentypen zu XPath-Datentypen (SQLXML 4.0).
In einem zurückgegebenen Dokument werden alle SQL Server-Datentypen in Zeichenfolgendarstellungen konvertiert. Einige Datentypen erfordern zusätzliche Konvertierungen. In der folgenden Tabelle sind die Konvertierungen für verschiedene xsd:type-Werte aufgelistet.
XSD-Datentyp |
SQL Server-Konvertierung |
---|---|
Boolesch (Boolean) |
CONVERT(bit, COLUMN) |
Date |
LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10) |
decimal |
CONVERT(money, COLUMN) |
id/idref/idrefs |
id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
nmtoken/nmtokens |
id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
Time |
SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24) |
Alle sonstigen |
Keine zusätzliche Konvertierung |
Hinweis |
---|
Einige von SQL Server zurückgegebene Werte sind möglicherweise nicht mit den über xsd:type angegebenen XML-Datentypen kompatibel. Das liegt entweder daran, dass keine Konvertierung möglich ist (zum Beispiel die Konvertierung von XYZ in einen decimal-Datentyp) oder daran, dass der Wert den Bereich dieses Datentyps überschreitet (zum Beispiel bei der Konvertierung von -100000 in einen UnsignedShort-XSD-Typ). Inkompatible Typkonvertierungen führen möglicherweise zu ungültigen XML-Dokumenten oder SQL Server-Fehlern. |
Zuordnen von SQL Server-Datentypen zu XSD-Datentypen
In der folgenden Tabelle wird eine offensichtliche Zuordnung zwischen SQL Server-Datentypen und XSD-Datentypen gezeigt. Wenn Sie den SQL Server-Typ kennen, können Sie dieser Tabelle den entsprechenden XSD-Typ für das XSD-Schema entnehmen.
SQL Server-Datentyp |
XSD-Datentyp |
---|---|
bigint |
long |
binary |
base64Binary |
bit |
boolean |
char |
string |
datetime |
dateTime |
decimal |
decimal |
float |
double |
image |
base64Binary |
int |
int |
money |
decimal |
nchar |
string |
ntext |
string |
nvarchar |
string |
numeric |
decimal |
real |
float |
smalldatetime |
dateTime |
smallint |
short |
smallmoney |
decimal |
sql_variant |
string |
sysname |
string |
text |
string |
timestamp |
dateTime |
tinyint |
unsignedByte |
varbinary |
base64Binary |
varchar |
string |
uniqueidentifier |
string |
sql:datatype-Anmerkung
Die sql:datatype-Anmerkung wird verwendet, um den SQL Server-Datentyp anzugeben. Diese Anmerkung ist obligatorisch, wenn:
Sie von einem XSD-Typ dateTime, date oder time ein Massenladen in eine dateTimeSQL Server-Spalte durchführen. In diesem Fall müssen Sie den SQL Server-Spaltendatentyp mit sql:datatype="dateTime" angeben. Diese Regel gilt auch für Updategrams.
Sie ein Massenladen in eine Spalte vom Typ SQL Serveruniqueidentifier durchführen und der XSD-Wert eine GUID mit Klammern ({ und }) ist. Wenn Sie sql:datatype="uniqueidentifier" angeben, werden die Klammern vor dem Einfügen in die Spalte aus dem Wert entfernt. Wird sql:datatype nicht angegeben, wird der Wert einschließlich Klammern gesendet, und der Einfüge- oder Aktualisierungsvorgang erzeugt einen Fehler.
Der XML-Datentyp base64Binary ist verschiedenen SQL Server-Datentypen (binary, image oder varbinary) zugeordnet. Um den XML-Datentyp base64Binaryeinem bestimmten SQL Server-Datentyp zuzuordnen, verwenden Sie die sql:datatype-Anmerkung. Diese Anmerkung gibt den expliziten SQL Server-Datentyp der Spalte an, der das Attribut zugeordnet ist. Dies ist nützlich, wenn Daten in der Datenbank gespeichert werden. Durch Angeben der sql:datatype-Anmerkung können Sie den expliziten SQL Server-Datentyp identifizieren.
Es wird im Allgemeinen empfohlen, sql:datatype im Schema anzugeben.
Beispiele
Es müssen bestimmte Anforderungen erfüllt sein, damit aus den folgenden Beispielen funktionstüchtige Beispiele erstellt werden können. Weitere Informationen finden Sie unter Anforderungen zum Ausführen von SQLXML-Beispielen.
A. Angeben von xsd:type
Dieses Beispiel zeigt, wie sich ein über das xsd:type-Attribut im Schema angegebener date XSD-Typ auf das daraus resultierende XML-Dokument auswirkt. Das Schema stellt eine XML-Ansicht der Tabelle Sales.SalesOrderHeader in der AdventureWorks-Datenbank bereit.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader">
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:string" />
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="OrderDate" type="xsd:date" />
<xsd:attribute name="DueDate" />
<xsd:attribute name="ShipDate" type="xsd:time" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
In diesem XSD-Schema gibt es drei Attribute, die einen Datumswert von SQL Server zurückgeben. Wenn das Schema:
xsd:type=date im OrderDate-Attribut angibt, wird der Datumsteil des von SQL Server für das OrderDate-Attribut zurückgegebenen Werts angezeigt.
xsd:type=time im ShipDate-Attribut angibt, wird der Uhrzeitteil des von SQL Server für das ShipDate-Attribut zurückgegebenen Werts angezeigt.
xsd:type nicht im DueDate-Attribut angibt, wird derselbe Wert angezeigt, der von SQL Server zurückgegeben wird.
So testen Sie eine XPath-Beispielabfrage mit dem Schema
Kopieren Sie den oben stehenden Schemacode, und fügen Sie ihn in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen xsdType.xml.
Kopieren Sie die folgende Vorlage, und fügen Sie sie in eine Textdatei ein. Speichern Sie die Datei unter dem Namen xsdTypeT.xml im gleichen Verzeichnis wie sdType.xml.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="xsdType.xml"> /Order </sql:xpath-query> </ROOT>
Der für das Zuordnungsschema (xsdType.xml) angegebene Verzeichnispfad bezieht sich auf das Verzeichnis, in dem die Vorlage gespeichert ist. Es kann auch ein absoluter Pfad angegeben werden. Beispiel:
mapping-schema="C:\SqlXmlTest\xsdType.xml"
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
Im Folgenden wird ein Teil des Resultsets aufgeführt:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43659"
CustomerID="676"
OrderDate="2001-07-01"
DueDate="2001-07-13T00:00:00"
ShipDate="00:00:00" />
<Order SalesOrderID="43660"
CustomerID="117"
OrderDate="2001-07-01"
DueDate="2001-07-13T00:00:00"
ShipDate="00:00:00" />
...
</ROOT>
Dies ist das entsprechende XDR-Schema:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader">
<AttributeType name="SalesOrderID" />
<AttributeType name="CustomerID" />
<AttributeType name="OrderDate" dt:type="date" />
<AttributeType name="DueDate" />
<AttributeType name="ShipDate" dt:type="time" />
<attribute type="SalesOrderID" sql:field="OrderID" />
<attribute type="CustomerID" sql:field="CustomerID" />
<attribute type="OrderDate" sql:field="OrderDate" />
<attribute type="DueDate" sql:field="DueDate" />
<attribute type="ShipDate" sql:field="ShipDate" />
</ElementType>
</Schema>
B. Angeben des SQL-Datentyps mit sql:datatype
Ein funktionstüchtiges Beispiel finden Sie unter Beispiel G in Beispiele für XML-Massenladen (SQLXML 4.0). In diesem Beispiel wird ein GUID-Wert, der "{" und "}" enthält, massengeladen. Das Schema in diesem Beispiel gibt sql:datatype an, um den SQL Server-Datentyp als uniqueidentifier zu identifizieren. Dieses Beispiel veranschaulicht, wann sql:datatype im Schema angegeben werden muss.