Delen via


Wijzigingen bulksgewijs kopiëren voor uitgebreide datum- en tijdtypen (OLE DB en ODBC)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

In dit onderwerp worden de datum-/tijdverbeteringen beschreven ter ondersteuning van functionaliteit voor bulksgewijs kopiëren. De informatie in dit onderwerp is geldig voor zowel OLE DB als ODBC in SQL Server Native Client.

Belangrijk

SQL Server Native Client (SNAC) wordt niet geleverd met:

  • SQL Server 2022 (16.x) en latere versies
  • SQL Server Management Studio 19 en latere versies

De SQL Server Native Client (SQLNCLI of SQLNCLI11) en de verouderde Microsoft OLE DB-provider voor SQL Server (SQLOLEDB) worden niet aanbevolen voor de ontwikkeling van nieuwe toepassingen.

Gebruik een van de volgende stuurprogramma's voor nieuwe projecten:

Voor SQLNCLI die als onderdeel van SQL Server Database Engine (versies 2012 tot en met 2019) wordt geleverd, raadpleegt u deze uitzondering voor de levenscyclus van ondersteuning.

Bestanden opmaken

Bij het interactief bouwen van indelingsbestanden beschrijft de volgende tabel de invoer die wordt gebruikt om datum-/tijdtypen en de bijbehorende namen van het hostbestandsgegevenstype op te geven.

Bestandstype Gegevenstype hostbestand Antwoord op de prompt: "Voer het bestandstype van het veld in <field_name> [<standaard>]:"
Datum/tijd SQLDATETIME d
Smalldatetime SQLDATETIM4 D
Datum SQLDATE de
Tijd SQLTIME te
Datum/tijd2 SQLDATETIME2 d2
Datetimeoffset SQLDATETIMEOFFSET doen

Het XSD-bestand met de XML-indeling heeft de volgende toevoegingen:

<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>  

Tekengegevensbestanden

In tekengegevensbestanden worden datum- en tijdwaarden weergegeven zoals beschreven in de sectie 'Gegevensindelingen: tekenreeksen en letterlijke waarden' van gegevenstypeondersteuning voor ODBC-datum- en tijdverbeteringen voor ODBC of van gegevenstypeondersteuning voor OLE DB-datum- en tijdverbeteringen voor OLE DB.

In systeemeigen gegevensbestanden worden datum- en tijdwaarden voor de vier nieuwe typen weergegeven als de TDS-weergaven met een schaal van 7 (omdat dit het maximum is dat wordt ondersteund door SQL Server- en BCP-gegevensbestanden worden de schaal van deze kolommen niet opgeslagen). Er is geen wijziging in de opslag van de bestaande datum/tijd- en smalldatetime type of de bijbehorende TDS-weergaven (tabular data stream).

De opslaggrootten voor de verschillende opslagtypen zijn als volgt voor OLE DB:

Bestandstype Opslaggrootte in bytes
datum/tijd 8
smalldatetime 4
datum 3
Tijd 6
datetime2 9
datetimeoffset 11

De grootten zijn als volgt voor ODBC. Houd er rekening mee dat het niet nodig is om precisie op te slaan in indelings- of gegevensbestanden, omdat BCP.exe altijd precisie van de server ophaalt.

Bestandstype Opslaggrootte in bytes Opslagindeling
datum/tijd (d) 8 TDS
smalldatetime (D) 4 TDS
datum (de) 3 TDS
tijd (te) 6 TDS
datetime2 (d2) 9 TDS
datetimeoffset (do) 11 TDS

BCP-typen in sqlncli.h

De volgende typen worden gedefinieerd in sqlncli.h die moeten worden gebruikt met de BCP API-extensies voor ODBC. Deze typen worden doorgegeven met de parameter eUserDataType van IBCPSession::BCPColFmt in OLE DB.

Bestandstype Gegevenstype hostbestand Typ sqlncli.h voor gebruik met IBCPSession::BCPColFmt Waarde
Datum/tijd SQLDATETIME BCP_TYPE_SQLDATETIME 0x3d
Smalldatetime SQLDATETIM4 BCP_TYPE_SQLDATETIME4 0x3a
Datum SQLDATE BCP_TYPE_SQLDATE 0x28
Tijd SQLTIME BCP_TYPE_SQLTIME 0x29
Datum/tijd2 SQLDATETIME2 BCP_TYPE_SQLDATETIME2 0x2a
Datetimeoffset SQLDATETIMEOFFSET BCP_TYPE_SQLDATETIMEOFFSET 0x2b

Conversies van BCP-gegevenstypen

De volgende tabellen bevatten conversiegegevens.

OLE DB Opmerking De volgende conversies worden uitgevoerd door IBCPSession. IRowsetFastLoad maakt gebruik van OLE DB-conversies zoals gedefinieerd in Conversies uitgevoerd van client naar server. Houd er rekening mee dat datum/tijd-waarden worden afgerond op 1/300e van een tweede en smalldatetime-waarden zijn ingesteld op nul nadat de hieronder beschreven clientconversies zijn uitgevoerd. Datum/tijd-afronding wordt doorgegeven aan uren en minuten, maar niet aan de datum.

Naar -->

Van
datum Tijd smalldatetime datum/tijd datetime2 datetimeoffset verkolen wchar
Datum 1 - 1,6 1,6 1,6 1,5,6 1,3 1,3
Tijd N.V.T 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
Datum/tijd 1,2 1,4,10 1,12 1 1,10 1,5,10 1,11 1,11
Datum/tijd2 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 (datum) 9 - 9,6 (ODBC)9,6,12 (OLE DB) 9,6 (ODBC)9,6,12 (OLE DB) 9,6 9,5,6 N.V.T N.V.T
Char/wchar (tijd) - 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 N.V.T N.V.T
Char/wchar (datum/tijd) 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 N.V.T N.V.T
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 N.V.T N.V.T

Sleutel tot symbolen

Symbool Betekenis
- Er wordt geen conversie ondersteund.

Er wordt een diagnostische ODBC-record gegenereerd met SQLSTATE 07006 en het bericht 'Schending van kenmerk beperkt gegevenstype'.
1 Als de opgegeven gegevens ongeldig zijn, wordt er een diagnostische ODBC-record gegenereerd met SQLSTATE 22007 en het bericht 'Ongeldige datum/tijd-indeling'. Voor datetimeoffset-waarden moet het tijdgedeelte binnen het bereik liggen na conversie naar UTC, zelfs als er geen conversie naar UTC is aangevraagd. Dit komt doordat TDS en de server altijd de tijd normaliseren in datum/tijdoffset-waarden voor UTC. De client moet dus controleren of tijdonderdelen binnen het bereik vallen dat wordt ondersteund na conversie naar UTC.
2 Het tijdonderdeel wordt genegeerd.
3 Voor ODBC wordt, als afkapping met gegevensverlies optreedt, een diagnostische record gegenereerd met SQLSTATE 22001 en het bericht 'Tekenreeksgegevens, rechts afgekapt' Het aantal decimalen van de fractionele seconden (de schaal) wordt bepaald op basis van de grootte van de doelkolom volgens de volgende tabel. Voor kolomgrootten die groter zijn dan het bereik in de tabel, wordt een schaal van 7 geïmpliceerd. Deze conversie moet maximaal negen fractionele tweede cijfers toestaan, het maximum dat is toegestaan door ODBC.

type: DBTIME2

impliciete schaal 0 8

impliciete schaal 1,7 10,16



type: DBTIMESTAMP

impliciete schaal 0: 19

Impliciete schaal 1..7: 21..27



type: DBTIMESTAMPOFFSET

impliciete schaal 0: 26

Impliciete schaal 1..7: 28..34

Als het afkappen met gegevensverlies voor OLE DB optreedt, wordt er een fout geplaatst. Voor datetime2 wordt het aantal decimale seconden (de schaal) bepaald op basis van de grootte van de doelkolom volgens de volgende tabel. Voor kolomgrootten die groter zijn dan het bereik in de tabel wordt een schaal van 9 geïmpliceerd. Deze conversie moet maximaal negen fractionele tweede cijfers toestaan, het maximum dat is toegestaan door OLE DB.

type: DBTIME2

impliciete schaal 0 8

impliciete schaal 1..9 1..9



type: DBTIMESTAMP

impliciete schaal 0: 19

impliciete schaal 1..9: 21..29



type: DBTIMESTAMPOFFSET

impliciete schaal 0: 26

impliciete schaal 1..9: 28..36
4 Het datumonderdeel wordt genegeerd.
5 De tijdzone is ingesteld op UTC (bijvoorbeeld 00:00).
6 De tijd is ingesteld op nul.
7 De datum is ingesteld op 1900-01-01.
8 De tijdzone-offset wordt genegeerd.
9 De tekenreeks wordt geparseerd en geconverteerd naar een datum, datum/tijd, datetimeoffset of tijdwaarde, afhankelijk van het eerste interpunctieteken dat is aangetroffen en de aanwezigheid van de resterende onderdelen. De tekenreeks wordt vervolgens geconverteerd naar het doeltype, volgens de regels in de tabel aan het einde van dit onderwerp voor het brontype dat door dit proces is gedetecteerd. Als de opgegeven gegevens niet kunnen worden geparseerd zonder fout, of als een onderdeelonderdeel buiten het toegestane bereik valt, of als er geen conversie van het letterlijke type naar het doeltype is, wordt er een fout geplaatst (OLE DB) of wordt er een ODBC-diagnoserecord gegenereerd met SQLSTATE 22018 en het bericht 'Ongeldige tekenwaarde voor cast-specificatie'. Als het jaar buiten het bereik van deze typen valt, wordt er een fout geplaatst (OLE DB) of wordt er een ODBC-diagnoserecord gegenereerd met SQLSATE 22007 en het bericht 'Ongeldige datum/tijd-indeling'.

Voor datetimeoffset moet de waarde binnen het bereik liggen na conversie naar UTC, zelfs als er geen conversie naar UTC is aangevraagd. Dit komt doordat TDS en de server altijd de tijd normaliseren in datum/tijdoffset-waarden voor UTC, zodat de client moet controleren of tijdonderdelen binnen het bereik vallen dat wordt ondersteund na conversie naar UTC. Als de waarde zich niet binnen het ondersteunde UTC-bereik bevindt, wordt er een fout geplaatst (OLE DB) of wordt er een diagnostische ODBC-record gegenereerd met SQLSTATE 22007 en het bericht 'Ongeldige datum/tijd-indeling'.
10 Als afkapping met gegevensverlies optreedt op een client naar serverconversie, wordt er een fout geplaatst (OLE DB) of wordt een diagnostische ODBC-record gegenereerd met SQLSTATE 22008 en het bericht 'Datum/tijd veld overloop'. Deze fout treedt ook op als de waarde buiten het bereik valt dat kan worden vertegenwoordigd door het UTC-bereik dat door de server wordt gebruikt. Als de afkapping van seconden of fractionele seconden plaatsvindt op een server naar clientconversie, is er slechts een waarschuwing.
11 Als afkapping met gegevensverlies optreedt, wordt er een diagnostische record gegenereerd.

Bij een server-naar-clientconversie is dit een waarschuwing (ODBC SQLSTATE S1000).

Bij een client-naar-serverconversie is dit een fout (ODBC SQLSTATE 22001).
12 Seconden worden ingesteld op nul en fractionele seconden worden verwijderd. Er is geen afkappingsfout mogelijk.
N.V.T Bestaand GEDRAG van SQL Server 2005 (9.x) en eerdere versies wordt gehandhaafd.

Zie ook

ODBC- (Datum- en tijdverbeteringen)
Verbeteringen aan datum en tijd (OLE DB)