Nieuwe datum- en tijdfuncties met eerdere VERSIES van SQL Server (OLE DB)
van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)
In dit onderwerp wordt het verwachte gedrag beschreven wanneer een clienttoepassing die gebruikmaakt van verbeterde datum- en tijdfuncties communiceert met een versie van SQL Server ouder dan SQL Server 2008 (10.0.x) en wanneer een client die is gecompileerd met een versie van SQL Server Native Client ouder dan SQL Server 2008 (10.0.x) opdrachten verzendt naar een server die uitgebreide datum- en tijdfuncties ondersteunt.
Down-Level clientgedrag
Clienttoepassingen die gebruikmaken van een versie van SQL Server Native Client ouder dan SQL Server 2008 (10.0.x) zien de nieuwe datum-/tijdtypen als nvarchar kolommen. De kolominhoud zijn letterlijke weergaven. Zie de sectie 'Gegevensindelingen: tekenreeksen en letterlijke waarden' van ondersteuning voor gegevenstypen voor verbeteringen van OLE DB-datum en -tijdvoor meer informatie. De kolomgrootte is de maximale letterlijke lengte voor de precisie die is opgegeven voor de kolom.
Catalogus-API's retourneren metagegevens die consistent zijn met de code van het gegevenstype down-level die wordt geretourneerd aan de client (bijvoorbeeld nvarchar) en de bijbehorende weergave op down-level (bijvoorbeeld de juiste letterlijke indeling). De geretourneerde naam van het gegevenstype is echter de werkelijke sql Server 2008 (10.0.x) typenaam.
Wanneer een clienttoepassing op down-level wordt uitgevoerd op een SQL Server 2008-server (10.0.x) (of hoger) waarop schemawijzigingen zijn aangebracht in datum-/tijdtypen, is het verwachte gedrag als volgt:
OLE DB-clienttype | SQL Server 2005-type | TYPE SQL Server 2008 (of hoger) | Resultaatconversie (server naar client) | Parameterconversie (client naar server) |
---|---|---|---|---|
DBTYPE_DBDATE | Datum/tijd | Datum | OK | OK |
DBTYPE_DBTIMESTAMP | Tijdvelden ingesteld op nul. | IRowsetChange mislukt vanwege afkapping van tekenreeksen als het tijdveld niet-nul is. | ||
DBTYPE_DBTIME | Tijd(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Datumvelden ingesteld op huidige datum. | IRowsetChange mislukt vanwege afkapping van tekenreeksen als fractionele seconden niet-nul zijn. Datum wordt genegeerd. |
||
DBTYPE_DBTIME | Tijd(7) | Mislukt- ongeldige tijds letterlijke tijd. | OK | |
DBTYPE_DBTIMESTAMP | Mislukt- ongeldige tijds letterlijke tijd. | OK | ||
DBTYPE_DBTIMESTAMP | Datetime2(3) | OK | OK | |
DBTYPE_DBTIMESTAMP | Datetime2(7) | OK | OK | |
DBTYPE_DBDATE | Smalldatetime | Datum | OK | OK |
DBTYPE_DBTIMESTAMP | Tijdvelden ingesteld op nul. | IRowsetChange mislukt vanwege afkapping van tekenreeksen als het tijdveld niet-nul is. | ||
DBTYPE_DBTIME | Tijd(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Datumvelden ingesteld op huidige datum. | IRowsetChange mislukt vanwege afkapping van tekenreeksen als fractionele seconden niet-nul zijn. Datum wordt genegeerd. |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | OK | OK |
OK betekent dat als het werkt met SQL Server 2005 (9.x), het moet blijven werken met SQL Server 2008 (10.0.x) (of hoger).
Alleen de volgende algemene schemawijzigingen zijn overwogen:
Het gebruik van een nieuw type waarbij logisch een toepassing alleen een datum- of tijdwaarde vereist. De toepassing moest echter datum/tijd of smalldatetime gebruiken omdat er geen afzonderlijke datum- en tijdtypen beschikbaar waren.
Een nieuw type gebruiken om extra precisie of nauwkeurigheid van fractionele seconden te verkrijgen.
Overschakelen naar datum/tijd2 omdat dit het voorkeursgegevenstype is voor datum en tijd.
Toepassingen die servermetagegevens gebruiken die zijn verkregen via ICommandWithParameters::GetParameterInfo of schemarijsets om informatie over het parametertype in te stellen via ICommandWithParameters::SetParameterInfo, mislukken tijdens clientconversies waarbij de tekenreeksweergave van een brontype groter is dan de tekenreeksweergave van het doeltype. Als een clientbinding bijvoorbeeld gebruikmaakt van DBTYPE_DBTIMESTAMP en de serverkolom datum is, wordt de waarde door SQL Server Native Client geconverteerd naar 'jjjj-dd-mm uu:mm:ss.fff', maar de metagegevens van de server worden geretourneerd als nvarchar(10). De resulterende overloop veroorzaakt DBSTATUS_E_CANTCONVERTVALUE. Vergelijkbare problemen ontstaan met gegevensconversies door IRowsetChange, omdat de metagegevens van de rijenset worden ingesteld op basis van de metagegevens van de resultatenset.
Metagegevens van parameters en rijenset
In deze sectie worden metagegevens beschreven voor parameters, resultaatkolommen en schemarijsets voor clients die zijn gecompileerd met een versie van SQL Server Native Client die ouder is dan SQL Server 2008 (10.0.x).
ICommandWithParameters::GetParameterInfo
De DBPARAMINFO-structuur retourneert de volgende informatie via de parameter prgParamInfo:
Parametertype | wType | ulParamSize | bPrecision | bScale |
---|---|---|---|---|
datum | DBTYPE_WSTR | 10 | ~0 | ~0 |
Tijd | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datum/tijd | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
U ziet dat sommige van deze waardebereiken niet doorlopend zijn; 9 ontbreekt bijvoorbeeld in 8.10..16. Dit komt door de toevoeging van een decimaalteken wanneer breuknauwkeurigheid groter is dan nul.
IColumnsRowset::GetColumnsRowset
De volgende kolommen worden geretourneerd:
Kolomtype | DBCOLUMN_TYPE | DBCOLUMN_COLUMNSIZE | DBCOLUMN_PRECISION | DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION |
---|---|---|---|---|
datum | DBTYPE_WSTR | 10 | NUL | NUL |
Tijd | DBTYPE_WSTR | 8, 10..16 | NUL | NUL |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datum/tijd | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | NUL | NUL |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | NUL | NUL |
ColumnsInfo::GetColumnInfo
De structuur DBCOLUMNINFO retourneert de volgende informatie:
Parametertype | wType | ulColumnSize | bPrecision | bScale |
---|---|---|---|---|
datum | DBTYPE_WSTR | 10 | ~0 | ~0 |
time(1..7) | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datum/tijd | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
Schemarijen
In deze sectie worden metagegevens voor parameters, resultaatkolommen en schemarijsets voor nieuwe gegevenstypen besproken. Deze informatie is handig als u een clientprovider hebt ontwikkeld met behulp van hulpprogramma's die ouder zijn dan SQL Server 2008 (10.0.x) SQL Server Native Client.
Rijenset KOLOMMEN
De volgende kolomwaarden worden geretourneerd voor datum-/tijdtypen:
Kolomtype | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | DATETIME_PRECISION |
---|---|---|---|---|
datum | DBTYPE_WSTR | 10 | 20 | NUL |
Tijd | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | NUL |
smalldatetime | DBTYPE_DBTIMESTAMP | NUL | NUL | 0 |
datum/tijd | DBTYPE_DBTIMESTAMP | NUL | NUL | 3 |
datetime2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | NUL |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | NUL |
PROCEDURE_PARAMETERS rijenset
De volgende kolomwaarden worden geretourneerd voor datum-/tijdtypen:
Kolomtype | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | TYPE_NAME LOCAL_TYPE_NAME |
---|---|---|---|---|
datum | DBTYPE_WSTR | 10 | 20 | datum |
Tijd | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | Tijd |
smalldatetime | DBTYPE_DBTIMESTAMP | NUL | NUL | smalldatetime |
datum/tijd | DBTYPE_DBTIMESTAMP | NUL | NUL | datum/tijd |
datetime2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | datetime2 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | datetimeoffset |
PROVIDER_TYPES rijenset
De volgende rijen worden geretourneerd voor datum-/tijdtypen:
Type -> Kolom |
datum | Tijd | smalldatetime | datum/tijd | datetime2 | datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME | datum | Tijd | smalldatetime | datum/tijd | datetime2 | datetimeoffset |
DATA_TYPE | DBTYPE_WSTR | DBTYPE_WSTR | DBTYPE_DBTIMESTAMP | DBTYPE_DBTIMESTAMP | DBTYPE_WSTR | DBTYPE_WSTR |
COLUMN_SIZE | 10 | 16 | 16 | 23 | 27 | 34 |
LITERAL_PREFIX | ' | ' | ' | ' | ' | ' |
LITERAL_SUFFIX | ' | ' | ' | ' | ' | ' |
CREATE_PARAMS | NUL | NUL | NUL | NUL | NUL | NUL |
IS_NULLABLE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE |
CASE_SENSITIVE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
DOORZOEKBAAR | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE |
UNSIGNED_ATTRIBUTE | NUL | NUL | NUL | NUL | NUL | NUL |
FIXED_PREC_SCALE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
AUTO_UNIQUE_VALUE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
LOCAL_TYPE_NAME | datum | Tijd | smalldatetime | datum/tijd | datetime2 | datetimeoffset |
MINIMUM_SCALE | NUL | NUL | NUL | NUL | NUL | NUL |
MAXIMUM_SCALE | NUL | NUL | NUL | NUL | NUL | NUL |
GUID | NUL | NUL | NUL | NUL | NUL | NUL |
TYPELIB | NUL | NUL | NUL | NUL | NUL | NUL |
VERSIE | NUL | NUL | NUL | NUL | NUL | NUL |
IS_LONG | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
BEST_MATCH | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_TRUE | VARIANT_FALSE | VARIANT_FALSE |
IS_FIXEDLENGTH | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
Down-Level servergedrag
Wanneer verbinding wordt gemaakt met een server met een eerdere versie dan SQL Server 2008 (10.0.x), resulteert elke poging om de nieuwe servertypenamen te gebruiken (bijvoorbeeld met ICommandWithParameters::SetParameterInfo of ITableDefinition::CreateTable) DB_E_BADTYPENAME.
Als nieuwe typen afhankelijk zijn van parameters of resultaten zonder het gebruik van een typenaam en het nieuwe type wordt gebruikt om het servertype impliciet op te geven of er geen geldige conversie van het servertype naar het clienttype is, wordt DB_E_ERRORSOCCURRED geretourneerd en wordt DBBINDSTATUS_UNSUPPORTED_CONVERSION ingesteld als de bindingsstatus voor de accessor die tijdens Execute wordt gebruikt.
Als er een ondersteunde clientconversie van het buffertype naar het servertype voor de serverversie van de verbinding bestaat, kunnen alle clientbuffertypen worden gebruikt. In deze context betekent servertype het type dat is opgegeven door ICommandWithParameters::SetParameterInfo of impliciet door het buffertype als ICommandWithParameters::SetParameterInfo niet is aangeroepen. Dit betekent dat DBTYPE_DBTIME2 en DBTYPE_DBTIMESTAMPOFFSET kunnen worden gebruikt met servers op een lager niveau, of wanneer DataTypeCompatibility=80, als de clientconversie naar een ondersteund servertype slaagt. Als het servertype onjuist is, kan er natuurlijk nog steeds een fout worden gerapporteerd door de server als er geen impliciete conversie naar het werkelijke servertype kan worden uitgevoerd.
SSPROP_INIT_DATATYPECOMPATIBILITY gedrag
Wanneer SSPROP_INIT_DATATYPECOMPATIBILITY is ingesteld op SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, worden de nieuwe datum-/tijdtypen en bijbehorende metagegevens weergegeven aan clients zoals ze worden weergegeven voor downlevel clients, zoals beschreven in Wijzigingen bulksgewijs kopiƫren voor verbeterde datum- en tijdtypen (OLE DB en ODBC).
Vergelijkbaarheid voor IRowsetFind
Alle vergelijkingsoperatoren zijn toegestaan voor de nieuwe typen datum/tijd, omdat ze worden weergegeven als tekenreekstypen in plaats van datum-/tijdtypen.