Massenkopieränderungen für verbesserte Datum-/Uhrzeittypen (OLE DB und ODBC)
In diesem Thema werden die Datum-/Uhrzeiterweiterungen beschrieben, die die Massenkopierfunktionalität unterstützen. Die Informationen in diesem Thema sind für OLE DB und ODBC in SQL Server Native Client gültig.
Formatdateien
Beim interaktiven Erstellen von Formatdateien beschreibt die folgende Tabelle die Eingaben, die zum Angeben von Datum-/Uhrzeittypen verwendet werden, sowie die entsprechenden Datentypnamen der Hostdatei.
Speichertyp |
Datentyp in der Hostdatei |
Antwort auf die Eingabeaufforderung: "Geben Sie den Dateispeichertyp des Felds <Feldname> ein [<Standardwert>]:" |
---|---|---|
Datetime |
SQLDATETIME |
d |
Smalldatetime |
SQLDATETIM4 |
D |
Datum |
SQLDATE |
de |
Zeit |
SQLTIME |
te |
Datetime2 |
SQLDATETIME2 |
d2 |
Datetimeoffset |
SQLDATETIMEOFFSET |
do |
Das XML-Formatdatei-XSD hat die folgenden Hinzufügungen:
<xs:complexType name="SQLDATETIME2">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLDATETIMEOFFSET">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLDATE">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLTIME">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
Zeichendatendateien
In Zeichendatendateien werden Datums- und Uhrzeitwerte, wie im Abschnitt "Datenformate: Zeichenfolgen und Literale" unter Datentypunterstützung für ODBC-Verbesserungen bei Datum/Uhrzeit für ODBC oder unter Datentypunterstützung für OLE DB-Datum-/Uhrzeit-Verbesserungen für OLE DB beschrieben, dargestellt.
In systemeigenen Datendateien werden Datums- und Uhrzeitwerte für die vier neuen Typen als TDS-Entsprechungen mit sieben Dezimalstellen dargestellt, da es sich dabei um das von SQL Server unterstützte Maximum handelt und weil bcp-Datendateien die Dezimalstellen dieser Spalten nicht speichern. Es erfolgt keine Änderung an der Speicherung der vorhandenen datetime- und smalldatetime-Typen oder ihrer Tabular Data Stream-Entsprechungen (TDS).
Die Speichergrößen für die anderen Speichertypen sind für OLE DB wie folgt:
Dateispeichertyp |
Speichergröße (in Byte) |
---|---|
datetime |
8 |
smalldatetime |
4 |
date |
3 |
time |
6 |
datetime2 |
9 |
datetimeoffset |
11 |
Für ODBC lauten die Größen folgendermaßen: Beachten Sie, dass es nicht notwendig ist, Genauigkeit in Format- oder Datendateien zu speichern, da BCP.exe die Genauigkeit immer vom Server abruft.
Dateispeichertyp |
Speichergröße (in Byte) |
Speicherformat |
---|---|---|
datetime (d) |
8 |
TDS |
smalldatetime (D) |
4 |
TDS |
date (de) |
3 |
TDS |
time (te) |
6 |
TDS |
datetime2 (d2) |
9 |
TDS |
datetimeoffset (do) |
11 |
TDS |
BCP-Typen in sqlncli.h
Die folgenden Typen werden in sqlncli.h definiert, um mit den BCP API-Erweiterungen für ODBC verwendet zu werden. Diese Typen werden mit dem eUserDataType-Parameter von IBCPSession::BCPColFmt in OLE DB übergeben.
Speichertyp |
Datentyp in der Hostdatei |
Typ in sqlncli.h zur Verwendung mit IBCPSession::BCPColFmt |
Wert |
---|---|---|---|
Datetime |
SQLDATETIME |
BCP_TYPE_SQLDATETIME |
0x3d |
Smalldatetime |
SQLDATETIM4 |
BCP_TYPE_SQLDATETIME4 |
0x3a |
Datum |
SQLDATE |
BCP_TYPE_SQLDATE |
0x28 |
Zeit |
SQLTIME |
BCP_TYPE_SQLTIME |
0x29 |
Datetime2 |
SQLDATETIME2 |
BCP_TYPE_SQLDATETIME2 |
0x2a |
Datetimeoffset |
SQLDATETIMEOFFSET |
BCP_TYPE_SQLDATETIMEOFFSET |
0x2b |
BCP-Datentypkonvertierungen
Die folgenden Tabellen enthalten Konvertierungsinformationen.
OLE DB-Hinweis Die folgenden Konvertierungen werden von IBCPSession ausgeführt. IRowsetFastLoad verwendet die OLE DB-Konvertierungen, die in Client-/Server-Konvertierungen definiert sind. Beachten Sie, dass datetime-Werte auf 1/300stel einer Sekunde gerundet werden und dass für smalldatetime-Werte die Sekunden vom Server auf null festgelegt werden, nachdem die unten beschriebenen Clientkonvertierungen durchgeführt wurden. Datetime-Rundung wird durch Stunden und Minuten, aber nicht durch das Datum weitergegeben.
Nach --> Von |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
char |
wchar |
---|---|---|---|---|---|---|---|---|
Datum |
1 |
- |
1,6 |
1,6 |
1,6 |
1,5,6 |
1,3 |
1,3 |
Zeit |
Nicht zutreffend |
1,10 |
1,7,10 |
1,7,10 |
1,7,10 |
1,5,7,10 |
1,3 |
1,3 |
Smalldatetime |
1,2 |
1,4,10 |
1 |
1 |
1,10 |
1,5,10 |
1,11 |
1,11 |
Datetime |
1,2 |
1,4,10 |
1,12 |
1 |
1,10 |
1,5,10 |
1,11 |
1,11 |
Datetime2 |
1,2 |
1,4,10 |
1,10 (ODBC)1,12 (OLE DB) |
1,10 |
1,10 |
1,5,10 |
1,3 |
1,3 |
Datetimeoffset |
1,2,8 |
1,4,8,10 |
1,8,10 |
1,8,10 |
1,8,10 |
1,10 |
1,3 |
1,3 |
Char/wchar (date) |
9 |
- |
9,6 (ODBC)9,6,12 (OLE DB) |
9,6 (ODBC)9,6,12 (OLE DB) |
9,6 |
9,5,6 |
Nicht zutreffend |
Nicht zutreffend |
Char/wchar (time) |
- |
9,10 |
9,7,10 (ODBC)9,7,10,12 (OLE DB) |
9,7,10 (ODBC)9,7,10, 12 (OLE DB) |
9,7,10 |
9,5,7,10 |
Nicht zutreffend |
– |
Char/wchar (datetime) |
9,2 |
9,4,10 |
9,10 (ODBC)9,10,12 (OLE DB) |
9,10 (ODBC)9,10,12 (OLE DB) |
9,10 |
9,5,10 |
Nicht zutreffend |
– |
Char/wchar (datetimeoffset) |
9,2,8 |
9,4,8,10 |
9,8,10 (ODBC)9,8,10,12 (OLE DB) |
9,8,10 (ODBC)9,8,10,12 (OLE DB) |
9,8,10 |
9,10 |
Nicht zutreffend |
Nicht zutreffend |
Aufschlüsselung der Symbole
Symbol |
Bedeutung |
||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- |
Es wird keine Konvertierung unterstützt. Es wird ein ODBC-Diagnosedatensatz mit SQLSTATE 07006 und der Meldung "Attributverletzung beschränkter Datentypen" generiert. |
||||||||||||||||||||||||||||||||
1 |
Wenn die bereitgestellten Daten ungültig sind, wird ein ODBC-Diagnosedatensatz mit SQLSTATE 22007 und der Meldung "Ungültiges Datetime-Format" generiert. Für datetimeoffset-Werte muss der Uhrzeitteil nach der Konvertierung in das UTC-Format innerhalb des gültigen Bereichs liegen, und zwar selbst dann, wenn keine Konvertierung in UTC angefordert wird. Das liegt daran, dass TDS und der Server immer die Uhrzeit in datetimeoffset-Werten für UTC normalisieren. Darum muss der Client überprüfen, dass sich die Zeitkomponenten innerhalb des nach Konvertierung zu UTC unterstützten Bereichs befinden. |
||||||||||||||||||||||||||||||||
2 |
Die Uhrzeitkomponente wird ignoriert. |
||||||||||||||||||||||||||||||||
3 |
Wenn für ODBC eine Kürzung mit Datenverlust auftritt, wird ein Diagnosedatensatz mit SQLSTATE 22001 und der Meldung 'Die Zeichenfolgedaten wurden rechts abgeschnitten' generiert. Die Anzahl der Sekundendezimalstellen wird durch die Größe der Zielspalte gemäß der folgenden Tabelle bestimmt. Für Spaltengrößen, die den Bereich in der Tabelle übersteigen, werden 7 Dezimalstellen impliziert. Diese Konvertierung sollte bis zu neun Dezimalstellen für Sekundenbruchteile ermöglichen, das von ODBC zugelassene Maximum.
Für OLE DB wird ein Fehler generiert, wenn eine Kürzung mit Datenverlust auftritt. Für datetime2 wird die Anzahl der Dezimalstellen für Sekundenbruchteile anhand der Größe der Zielspalte gemäß der folgenden Tabelle bestimmt: Für Spaltengrößen, die den Bereich in der Tabelle übersteigen, werden 9 Dezimalstellen impliziert. Diese Konvertierung sollte bis zu neun Dezimalstellen für Sekundenbruchteile ermöglichen, das von OLE DB zugelassene Maximum.
|
||||||||||||||||||||||||||||||||
4 |
Die Datumskomponente wird ignoriert. |
||||||||||||||||||||||||||||||||
5 |
Die Zeitzone wird auf UTC festgelegt (zum Beispiel 00:00). |
||||||||||||||||||||||||||||||||
6 |
Die Uhrzeit wird auf 0 (Null) festgelegt. |
||||||||||||||||||||||||||||||||
7 |
Das Datum wird auf den 01.01.1900 festgelegt. |
||||||||||||||||||||||||||||||||
8 |
Der Zeitzonenoffset wird ignoriert. |
||||||||||||||||||||||||||||||||
9 |
Die Zeichenfolge wird analysiert und je nach dem ersten Satzzeichen und dem Vorhandensein weiterer Komponenten in einen date-, datetime-, datetimeoffset- oder time-Wert konvertiert. Die Zeichenfolge wird dann in den Zieltyp konvertiert. Dabei wird nach den Regeln am Ende dieses Themas für den Quelltyp vorgegangen, der von diesem Prozess ermittelt wird. Wenn die bereitgestellten Daten nicht ohne Fehler analysiert werden können, oder wenn sich ein Komponententeil außerhalb des zulässigen Bereichs befindet, oder wenn keine Konvertierung vom Literaltyp zum Zieltyp stattfindet, wird ein Fehler angezeigt (OLE DB), oder es wird ein ODBC-Diagnosedatensatz mit SQLSTATE 22018 und der Meldung "Ungültiger Zeichenwert für Konvertierungsangabe" generiert. Wenn die Jahresangabe außerhalb des vom datetime- und smalldatetime-Parameter unterstützten Bereichs liegt, wird ein Fehler angezeigt (OLE DB), oder es wird ein Diagnosedatensatz mit SQLSTATE 22007 und der Meldung "Ungültiges Datetime-Format" generiert. Der Wert für datetimeoffset muss nach der Konvertierung in das UTC-Format innerhalb des gültigen Bereichs liegen und zwar selbst dann, wenn keine Konvertierung in UTC angefordert wird. Der Grund dafür ist, dass der TDS und der Server das Datum stets in datetimeoffset-Werte für UTC normalisieren, weshalb der Client prüfen muss, ob die Zeitkomponenten innerhalb des nach Konvertierung in UTC unterstützten Bereichs liegen. Wenn der Wert nicht innerhalb des unterstützten UTC-Bereichs liegt, wird ein Fehler angezeigt (OLE DB), oder es wird ein Diagnosedatensatz mit SQLSTATE 22007 und der Meldung "Ungültiges Datetime-Format" generiert. |
||||||||||||||||||||||||||||||||
10 |
Wenn es während einer Konvertierung vom Client zum Server zu Kürzungen mit Datenverlust kommt, wird ein Fehler angezeigt (OLE DB), und es wird ein Diagnosedatensatz mit SQLSTATE 22008 und der Meldung "Überlauf im Datetime-Feld" generiert. Dieser Fehler tritt auch dann auf, wenn der Wert außerhalb des Bereichs liegt, der vom UTC-Bereich, den der Server verwendet, dargestellt werden kann. Wenn während einer Konvertierung vom Server zum Client eine Kürzung der Sekunden oder Sekundenbruchteile auftritt, wird lediglich eine Warnung angezeigt. |
||||||||||||||||||||||||||||||||
11 |
Wenn eine Kürzung mit Datenverlust auftritt, wird ein Diagnosedatensatz generiert. Bei einer Konvertierung vom Server zum Client handelt es sich dabei um eine Warnung (ODBC SQLSTATE S1000). Bei einer Konvertierung vom Client zum Server handelt es sich dabei um einen Fehler (ODBC SQLSTATE 22001). |
||||||||||||||||||||||||||||||||
12 |
Die Sekunden werden auf null festgelegt, und die Sekundenbruchteile werden verworfen. Kein Kürzungsfehler ist möglich. |
||||||||||||||||||||||||||||||||
– |
Das Verhalten von SQL Server 2005 und früheren Versionen ist beibehalten worden. |