Nowe funkcje daty i godziny z poprzednimi wersjami programu SQL Server (OLE DB)
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
W tym temacie opisano oczekiwane zachowanie, gdy aplikacja kliencka korzystająca z rozszerzonych funkcji daty i godziny komunikuje się z wersją programu SQL Server wcześniejszą niż SQL Server 2008 (10.0.x), a gdy klient skompilowany z wersją klienta natywnego programu SQL Server starszej niż SQL Server 2008 (10.0.x) wysyła polecenia do serwera obsługującego rozszerzone funkcje daty i godziny.
zachowanie klienta Down-Level
Aplikacje klienckie korzystające z wersji klienta natywnego programu SQL Server starszej niż SQL Server 2008 (10.0.x) widzą nowe typy dat/godzin jako kolumny varchar. Zawartość kolumny to reprezentacje literału. Aby uzyskać więcej informacji, zobacz sekcję "Formaty danych: Ciągi i literały" obsługi typów danych dla ulepszeń daty i godziny OLE DB. Rozmiar kolumny to maksymalna długość literału dla dokładności określonej dla kolumny.
Interfejsy API wykazu będą zwracać metadane zgodne z kodem typu danych na poziomie dół zwróconym do klienta (na przykład nvarchar) i skojarzona reprezentacja na poziomie podrzędnym (na przykład odpowiedni format literału). Zwracana nazwa typu danych będzie jednak nazwą typu rzeczywistego programu SQL Server 2008 (10.0.x).
Gdy aplikacja kliencka na poziomie down-level działa względem serwera SQL Server 2008 (10.0.x) (lub nowszego), na którym wprowadzono zmiany schematu w typach daty/godziny, oczekiwane zachowanie jest następujące:
Typ klienta OLE DB | Typ programu SQL Server 2005 | Typ programu SQL Server 2008 (lub nowszego) | Konwersja wyników (serwer na klienta) | Konwersja parametrów (klient na serwer) |
---|---|---|---|---|
DBTYPE_DBDATE | Data/godzina | Data | OK | OK |
DBTYPE_DBTIMESTAMP | Pola czasu ustawione na zero. | IRowsetChange zakończy się niepowodzeniem z powodu obcięcia ciągu, jeśli pole czasu jest inne niż zero. | ||
DBTYPE_DBTIME | Time(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Pola daty ustawione na bieżącą datę. | IRowsetChange zakończy się niepowodzeniem z powodu obcinania ciągów, jeśli ułamkowe sekundy są inne niż zero. Data jest ignorowana. |
||
DBTYPE_DBTIME | Czas (7) | Niepowodzenie — nieprawidłowy literał czasu. | OK | |
DBTYPE_DBTIMESTAMP | Niepowodzenie — nieprawidłowy literał czasu. | OK | ||
DBTYPE_DBTIMESTAMP | Data/godzina2(3) | OK | OK | |
DBTYPE_DBTIMESTAMP | Data/godzina2(7) | OK | OK | |
DBTYPE_DBDATE | Mała godzina | Data | OK | OK |
DBTYPE_DBTIMESTAMP | Pola czasu ustawione na zero. | IRowsetChange zakończy się niepowodzeniem z powodu obcięcia ciągu, jeśli pole czasu nie jest zerowe. | ||
DBTYPE_DBTIME | Time(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Pola daty ustawione na bieżącą datę. | IRowsetChange zakończy się niepowodzeniem z powodu obcinania ciągów, jeśli ułamkowe sekundy są inne niż zero. Data jest ignorowana. |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | OK | OK |
Ok oznacza, że w przypadku pracy z programem SQL Server 2005 (9.x) należy kontynuować pracę z programem SQL Server 2008 (10.0.x) (lub nowszym).
Brano pod uwagę tylko następujące typowe zmiany schematu:
Użycie nowego typu, w którym aplikacja logicznie wymaga tylko wartości daty lub godziny. Jednak aplikacja została zmuszona do używania data/godzina lub smalldatetime, ponieważ oddzielne typy dat i godzin nie były dostępne.
Użycie nowego typu w celu uzyskania dodatkowej precyzji lub dokładności ułamkowej sekund.
Przełączenie na data/godzina2, ponieważ jest to preferowany typ danych dla daty i godziny.
Aplikacje korzystające z metadanych serwera uzyskanych za pośrednictwem parametrów ICommandWithParameters::GetParameterInfo lub zestawów wierszy schematu w celu ustawienia informacji o typie parametru za pośrednictwem parametrów ICommandWithParameters::SetParameterInfo zakończy się niepowodzeniem podczas konwersji klienta, gdzie reprezentacja ciągu typu źródłowego jest większa niż reprezentacja ciągu typu docelowego. Jeśli na przykład powiązanie klienta używa DBTYPE_DBTIMESTAMP, a kolumna serwera to data, klient natywny programu SQL Server przekonwertuje wartość na "rrrr-dd-mm hh:mm:ss.fff", ale metadane serwera zostaną zwrócone jako nvarchar(10). Wynikowe przepełnienie powoduje DBSTATUS_E_CANTCONVERTVALUE. Podobne problemy występują w przypadku konwersji danych przez IRowsetChange, ponieważ metadane zestawu wierszy są ustawiane na podstawie metadanych zestawu wyników.
Metadane parametrów i zestawów wierszy
W tej sekcji opisano metadane parametrów, kolumn wyników i zestawów wierszy schematu dla klientów skompilowanych przy użyciu wersji klienta natywnego programu SQL Server starszej niż SQL Server 2008 (10.0.x).
ICommandWithParameters::GetParameterInfo
Struktura DBPARAMINFO zwraca następujące informacje za pomocą parametru prgParamInfo:
Typ parametru | wType | ulParamSize | bPrecision | bScale |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | ~0 | ~0 |
Godzina | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
data/godzina | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
data/godzina2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
Zwróć uwagę, że niektóre z tych zakresów wartości nie są ciągłe; na przykład brakuje wartości 9 w 8,10..16. Jest to spowodowane dodaniu punktu dziesiętnego, gdy precyzja ułamkowa jest większa niż zero.
IColumnsRowset::GetColumnsRowset
Zwracane są następujące kolumny:
Typ kolumny | DBCOLUMN_TYPE | DBCOLUMN_COLUMNSIZE | DBCOLUMN_PRECISION | DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | ZERO | ZERO |
Godzina | DBTYPE_WSTR | 8, 10..16 | ZERO | ZERO |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
data/godzina | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
data/godzina2 | DBTYPE_WSTR | 19,21..27 | ZERO | ZERO |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | ZERO | ZERO |
ColumnsInfo::GetColumnInfo
Struktura DBCOLUMNINFO zwraca następujące informacje:
Typ parametru | wType | ulColumnSize | bPrecision | bScale |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | ~0 | ~0 |
time(1..7) | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
data/godzina | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
data/godzina2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
Zestawy wierszy schematu
W tej sekcji omówiono metadane parametrów, kolumn wyników i zestawów wierszy schematu dla nowych typów danych. Te informacje są przydatne w przypadku dostawcy klienta opracowanego przy użyciu narzędzi starszych niż sql Server 2008 (10.0.x) sql Server Native Client.
Zestaw wierszy KOLUMN
Następujące wartości kolumn są zwracane dla typów daty/godziny:
Typ kolumny | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | DATETIME_PRECISION |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | 20 | ZERO |
Godzina | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | ZERO |
smalldatetime | DBTYPE_DBTIMESTAMP | ZERO | ZERO | 0 |
data/godzina | DBTYPE_DBTIMESTAMP | ZERO | ZERO | 3 |
data/godzina2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | ZERO |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | ZERO |
zestaw wierszy PROCEDURE_PARAMETERS
Następujące wartości kolumn są zwracane dla typów daty/godziny:
Typ kolumny | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | TYPE_NAME LOCAL_TYPE_NAME |
---|---|---|---|---|
data | DBTYPE_WSTR | 10 | 20 | data |
Godzina | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | Godzina |
smalldatetime | DBTYPE_DBTIMESTAMP | ZERO | ZERO | smalldatetime |
data/godzina | DBTYPE_DBTIMESTAMP | ZERO | ZERO | data/godzina |
data/godzina2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | data/godzina2 |
datetimeoffset | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | datetimeoffset |
zestaw wierszy PROVIDER_TYPES
Następujące wiersze są zwracane dla typów daty/godziny:
Typ —> Kolumna |
data | Godzina | smalldatetime | data/godzina | data/godzina2 | datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME | data | Godzina | smalldatetime | data/godzina | data/godzina2 | 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 | ZERO | ZERO | ZERO | ZERO | ZERO | ZERO |
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 |
PRZESZUKIWANIA | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE |
UNSIGNED_ATTRIBUTE | ZERO | ZERO | ZERO | ZERO | ZERO | ZERO |
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 | data | Godzina | smalldatetime | data/godzina | data/godzina2 | datetimeoffset |
MINIMUM_SCALE | ZERO | ZERO | ZERO | ZERO | ZERO | ZERO |
MAXIMUM_SCALE | ZERO | ZERO | ZERO | ZERO | ZERO | ZERO |
GUID | ZERO | ZERO | ZERO | ZERO | ZERO | ZERO |
TYPELIB | ZERO | ZERO | ZERO | ZERO | ZERO | ZERO |
WERSJA | ZERO | ZERO | ZERO | ZERO | ZERO | ZERO |
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 |
zachowanie serwera Down-Level
Po nawiązaniu połączenia z serwerem starszej wersji niż SQL Server 2008 (10.0.x) każda próba użycia nowych nazw typów serwera (na przykład z parametrami ICommandWithParameters::SetParameterInfo lub ITableDefinition::CreateTable) spowoduje DB_E_BADTYPENAME.
Jeśli nowe typy są powiązane z parametrami lub wynikami bez użycia nazwy typu, a nowy typ jest używany do określania typu serwera niejawnie lub nie ma prawidłowej konwersji z typu serwera na typ klienta, DB_E_ERRORSOCCURRED jest zwracany, a DBBINDSTATUS_UNSUPPORTED_CONVERSION jest ustawiany jako stan powiązania dla metody dostępu używanej podczas wykonywania.
Jeśli istnieje obsługiwana konwersja klienta z typu buforu na typ serwera dla wersji serwera w połączeniu, można użyć wszystkich typów klienta. W tym kontekście typ serwera oznacza typ określony przez ICommandWithParameters::SetParameterInfo lub implikowany przez typ buforu, jeśli nie wywołano właściwości ICommandWithParameters::SetParameterInfo. Oznacza to, że DBTYPE_DBTIME2 i DBTYPE_DBTIMESTAMPOFFSET mogą być używane z serwerami na poziomie podrzędnym lub gdy parametr DataTypeCompatibility=80, jeśli konwersja klienta na obsługiwany typ serwera powiedzie się. Oczywiście jeśli typ serwera jest niepoprawny, błąd może być nadal zgłaszany przez serwer, jeśli nie może wykonać niejawnej konwersji na rzeczywisty typ serwera.
zachowanie SSPROP_INIT_DATATYPECOMPATIBILITY
Gdy SSPROP_INIT_DATATYPECOMPATIBILITY jest ustawiona na SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, nowe typy daty/godziny i skojarzone metadane są widoczne dla klientów na poziomie podrzędnym, zgodnie z opisem w zmiany kopiowania zbiorczego dla rozszerzonych typów dat i godzin (OLE DB i ODBC).
Porównywalność dla IRowsetFind
Wszystkie operatory porównania są dozwolone dla nowych typów daty/godziny, ponieważ są one wyświetlane jako typy ciągów, a nie typy daty/godziny.
Zobacz też