Massenkopieränderungen für verbesserte Datums- und Uhrzeittypen (OLE DB und ODBC)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

In diesem Thema werden die Datum-/Uhrzeiterweiterungen beschrieben, die die Massenkopierfunktionalität unterstützen. Die Informationen in diesem Thema gelten sowohl für OLE DB als auch für ODBC in SQL Server Native Client.

Wichtig

Der SQL Server Native Client (häufig abgekürzt mit SNAC) wurde aus SQL Server 2022 (16.x) und SQL Server Management Studio 19 (SSMS) entfernt. Der SQL Server Native Client (SQLNCLI oder SQLNCLI11) und der Microsoft OLE DB-Legacyanbieter für SQL Server (SQLOLEDB) werden für neue Anwendungsentwicklungen nicht empfohlen. Verwenden Sie in Zukunft den neuen Microsoft OLE DB-Treiber für SQL Server (MSOLEDBSQL) oder den neuesten Microsoft ODBC Driver for SQL Server. Informationen zu SQLNCLI, das als Komponente von SQL Server Datenbank-Engine (Versionen 2012 bis 2019) ausgeliefert wird, finden Sie in dieser Supportlebenszyklus-Ausnahme.

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.

Dateispeichertyp Datentyp in der Hostdatei Antwort auf die Eingabeaufforderung: „Geben Sie den Dateispeichertyp des Felds <Feldname> ein [<Standardwert>]:“
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" von Datentypunterstützung für ODBC-Datums- und Uhrzeitverbesserungen für ODBC oder von Datentypunterstützung für OLE DB-Datums- und Uhrzeitverbesserungen für OLE DB beschrieben dargestellt.

In nativen Datenfladen werden Datums- und Uhrzeitwerte für die vier neuen Typen als TDS-Darstellungen mit einer Skala von 7 dargestellt (da dies das maximum ist, das von SQL Server unterstützt wird und bcp-Datendateien die Skalierung 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 Parameter eUserDataType von IBCPSession::BCPColFmt in OLE DB übergeben.

Dateispeichertyp Datentyp in der Hostdatei Geben Sie sqlncli.h für die Verwendung mit IBCPSession::BCPColFmt ein. Wert
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 ausgeführt. IRowsetFastLoad nutzt OLE DB-Konvertierungen gemäß der Definition unter Konvertierungen von Client zu Server. 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.

Bis -->

From
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 bei ODBC eine Abschneidung mit Datenverlust auftritt, wird ein Diagnosedatensatz mit SQLSTATE 22001 und meldung "Zeichenfolgendaten, rechts abgeschnitten" Generiert. Die Anzahl der Sekundenbruchteile (die Skalierung) wird anhand der 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.

Typ: DBTIME2

Implizierte Dezimalstellen 0 8

Implizierte Skalierung 1..7 10,16



Typ: DBTIMESTAMP

Implizierte Dezimalstellen 0: 19

Implizierte Skalierung 1..7: 21..27



Typ: DBTIMESTAMPOFFSET

Implizierte Dezimalstellen 0: 26

Implizierte Skalierung 1..7: 28..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.

Typ: DBTIME2

Implizierte Dezimalstellen 0 8

Implizierte Dezimalstellen 1..91..9



Typ: DBTIMESTAMP

Implizierte Dezimalstellen 0: 19

Implizierte Dezimalstellen 1..9: 21..29



Typ: DBTIMESTAMPOFFSET

Implizierte Dezimalstellen 0: 26

Implizierte Dezimalstellen 1..9: 28..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 (9.x) und früheren Versionen ist beibehalten worden.

Weitere Informationen

Verbesserungen bei Datum und Zeit (ODBC)
Verbesserungen bei Datum und Uhrzeit (OLE DB)