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

Reaktion auf die Eingabeaufforderung: "Geben Sie den Datenspeichertyp für das Feld <field_name> [<Standard>]" ein:

Datetime

SQLDATETIME

d

Smalldatetime

SQLDATETIM4

D

Date

SQLDATE

de

Time

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:

Speichertyp

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.

Speichertyp

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

Value

Datetime

SQLDATETIME

BCP_TYPE_SQLDATETIME

0x3d

Smalldatetime

SQLDATETIM4

BCP_TYPE_SQLDATETIME4

0x3a

Date

SQLDATE

BCP_TYPE_SQLDATE

0x28

Time

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 durchgeführt. IRowsetFastLoad verwendet OLE DB-Konvertierungen, die unter 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.

           In -->

Von

date

time

smalldatetime

datetime

datetime2

datetimeoffset

char

wchar

Date

1

-

1,6

1,6

1,6

1,5,6

1,3

1,3

Time

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

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

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

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

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.

TypImplizierte Dezimalstellen 0Implizierte Dezimalstellen 1..7
DBTIME2810,16
DBTIMESTAMP1921..27
DBTIMESTAMPOFFSET2628..34

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.

TypImplizierte Dezimalstellen 0Implizierte Dezimalstellen 1..9
DBTIME281..9
DBTIMESTAMP1921..29
DBTIMESTAMPOFFSET2628..36

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.