Ubežne klavzule in podatkovni tipi
Katere ubežne klavzule ODBC gonilnik razume v stavku in s katerim podatkovnim tipom SQL aplikaciji
javi vsak stolpec storitve. To stran potrebujete, ko stavek z {d …}, {ts …} ali {fn …} ne
deluje po pričakovanjih ali ko aplikacija prikaže drug tip, drugo dolžino ali drugo ime tipa kot prek
gonilnika ODBC SQL Serverja.
Specifikacija ODBC ubežne klavzule opisuje kot od proizvajalca neodvisen zapis literalov, funkcij in spojev (Microsoft: Escape Sequences in ODBC). Gonilniku ni treba podpirati vseh; spodnja tabela navaja, kaj ta gonilnik prevede sam.
Ubežne klavzule
| Klavzula | Vedenje |
|---|---|
{d 'yyyy-mm-dd'} | datum. Samo natanko ta oblika; drugo besedilo se zavrne |
{t 'hh:mm:ss'} | ura. Samo natanko ta oblika |
{ts 'yyyy-mm-dd hh:mm:ss[.f]'} | časovna točka z do sedmimi decimalnimi mesti. Samo natanko ta oblika |
{guid '…'} | identifikator (uniqueidentifier, Edm.Guid) |
LIKE … {escape 'x'} in LIKE … ESCAPE 'x' | ubežni znak za % in _ v vzorcu; nato veljajo pravila za LIKE pod Podprti SQL |
{call p(…)}, {? = call p(…)} (klic procedure) | prevedeno v EXEC p … in poslano na naslov za lastne stavke. Označba mesta pred enačajem prejme vrnjeno vrednost; označba mesta, ki jo aplikacija veže kot izhodno, dobi OUTPUT; prazen argument ({call p(?,,?)}) postane DEFAULT. Brez naslova za lastne stavke gonilnik klic zavrne z 42000 |
{fn …} (skalarne funkcije), {oj …} (zunanji spoj) in vsaka druga klavzula | ni prevedeno. Z naslovom za lastne stavke se stavek nespremenjen pošlje podatkovni zbirki, njen strežnik pa odloči, ali klavzulo razume; brez naslova jo gonilnik zavrne z 42000 |
Vrednost, ki se ne ujema s klavzulo ({d '01.06.2023'}, {ts '06/01/2023'}), naredi stavek neprevedljiv: z naslovom za
lastne stavke se pošlje nespremenjen podatkovni zbirki, brez njega pa se zavrne z 42000 in sporočilom, ki
navaja klavzulo in vrednost. Gonilnik vrednosti ne razlaga sam, ker bi ugibanje – najprej
dan ali mesec – brez kakršnega koli opozorila dala drugo množico vrstic.
GUID kot besedilo. Kjer je podano za stolpec GUID besedilo – kot niz v stavku ali kot vezana
besedilna vrednost –, gonilnik sprejme preprosto obliko, obliko z zavitimi oklepaji in obliko, ki jo
zapiše Access sam ({guid {33333333-…}}). Vezana vrednost je lahko tudi GUID (SQL_C_GUID) ali
16 bajtov (SQL_C_BINARY); tako Access veže ključ povezane tabele pri ponovnem nalaganju,
spreminjanju in brisanju.
Podatkovni tipi
Storitev vsak stolpec opiše s tipom OData (Edm.…) in, kjer ga navaja, z imenom tipa podatkovne zbirke
(Store.Type, glejte Zahteve za storitev OData). Iz tega gonilnik
aplikaciji javi tip SQL ODBC, dolžino in ime tipa:
| Tip storitve | Tip SQL (ODBC 3) | Ime tipa | Dolžina oziroma natančnost |
|---|---|---|---|
Edm.String z dolžino do 4.000 | SQL_WVARCHAR | nvarchar | dolžina storitve |
Edm.String z dolžino do 4.000 in Store.Type nchar | SQL_WCHAR | nchar | dolžina storitve |
Edm.String z dolžino do 8.000 in Store.Type varchar oziroma char | SQL_VARCHAR oziroma SQL_CHAR | varchar oziroma char | dolžina storitve |
Edm.String brez dolžine ali daljši | SQL_WLONGVARCHAR | ntext; pri Store.Type nvarchar (torej (max)) nvarchar | 1.073.741.823 |
Edm.String s Store.Type varchar brez dolžine (torej (max)) oziroma text | SQL_LONGVARCHAR | varchar oziroma text | 2.147.483.647 |
Edm.String s Store.Type xml | SQL_SS_XML (-152) | xml | 0 |
Edm.String s Store.Type sql_variant | SQL_SS_VARIANT (-150) | sql_variant | 8.000 |
Edm.Boolean | SQL_BIT | bit | 1 |
Edm.Byte | SQL_TINYINT | tinyint | 3 |
Edm.SByte, Edm.Int16 | SQL_SMALLINT | smallint | 5 |
Edm.Int32 | SQL_INTEGER | int | 10 |
Edm.Int64 | SQL_BIGINT | bigint | 19 |
Edm.Decimal | SQL_DECIMAL; pri Store.Type numeric SQL_NUMERIC | decimal oziroma numeric; pri Store.Type money/smallmoney to ime | natančnost in decimalna mesta storitve, brez navedbe 38 in 0 |
Edm.Single | SQL_REAL | real | 24 bitov |
Edm.Double | SQL_DOUBLE; pri Store.Type float SQL_FLOAT | float | 53 bitov |
Edm.Date | SQL_TYPE_DATE | date | 10 |
Edm.TimeOfDay | SQL_TYPE_TIME; pri Store.Type time SQL_SS_TIME2 (-154) | time | 8 oziroma 9 + decimalna mesta |
Edm.DateTimeOffset | SQL_TYPE_TIMESTAMP | datetime; pri Store.Type datetime2 oziroma smalldatetime to ime | 19 oziroma 20 + decimalna mesta (privzeto 3, največ 7); smalldatetime 16 |
Edm.DateTimeOffset s Store.Type datetimeoffset | SQL_SS_TIMESTAMPOFFSET (-155) | datetimeoffset | 26 oziroma 27 + decimalna mesta |
Edm.Guid | SQL_GUID | uniqueidentifier | 36 |
Edm.Binary z dolžino do 8.000 | SQL_VARBINARY; pri Store.Type binary SQL_BINARY | varbinary oziroma binary | dolžina storitve |
Edm.Binary kot različica vrstice (Store.Type timestamp/rowversion) | SQL_BINARY | timestamp | 8 |
Edm.Binary brez dolžine ali daljši | SQL_LONGVARBINARY | image; pri Store.Type varbinary (torej (max)) varbinary | 1.073.741.823 |
Edm.Binary s Store.Type hierarchyid, geography oziroma geometry | SQL_SS_UDT (-151) | v katalogu to ime, v rezultatu udt | hierarchyid 892, sicer 0 |
| vsak drug tip | – | – | stolpec ni ponujen |
Stolpec, ki ga storitev oštevilči sama, ima ime tipa z dodatkom identity (int identity), kot
pri gonilniku SQL Serverja; Access iz tega ustvari polje tipa samoštevilo („AutoNumber“).
Zakaj tako. Odločitve in njihovi razlogi:
| Določitev | Razlog |
|---|---|
Besedilo kot Unicode (SQL_W…), razen če ga podatkovna zbirka hrani ozko (Store.Type varchar, char, text) | OData besedilo prenaša kot niz JSON. Ozek tip bi vsako aplikacijo prisilil v pretvorbo prek kodne strani, ki ne more prikazati vsakega znaka storitve. Ozko shranjen stolpec vsebuje samo znake svoje kodne strani; ODBC Driver 18 ga opiše kot ozkega |
Neomejeno besedilo kot SQL_WLONGVARCHAR | Access samo iz tega ustvari polje z dolgim besedilom. Gonilnik SQL Serverja nvarchar(max) javi kot SQL_WVARCHAR z dolžino 0; aplikacija, ki medpomnilnike odmeri po dolžini, bi 0 prebrala kot „prazno“ |
Edm.DateTimeOffset kot časovna točka brez pasu, v koordiniranem univerzalnem času | Časovna točka ODBC nima pasu. Storitev, ki čas stenske ure brez pasu zapiše z Z (tako podatkovni prehod Wkl.Data.Gateway), dobi svojo shranjeno uro nespremenjeno nazaj; vrednost s pravim pasom se preračuna, tako da se primerjata dve časovni točki. Izjema je Store.Type datetimeoffset: stolpec ohrani svoj zamik, kot pri ODBC Driver 18 |
| Imena tipov podatkovne zbirke, kjer je tip ODBC isti | ODBC Driver 18 javi datetime2 in tipe (max) z njihovimi osnovnimi imeni. Aplikacije ta imena prikazujejo (ADO.NET GetDataTypeName, tabele sheme) |
Lastni tipi gonilnika SQL Serverja za time, datetimeoffset, xml, sql_variant in tipe CLR | Aplikacija, ki te tipe pozna, dobi isto kot od ODBC Driver 18. Access jih ne pozna in take stolpce z obema gonilnikoma prikaže kot besedilo z 255 znaki: uro z deli sekunde, časovno točko z zamikom. Če bi bila opisana kot navadna časovna točka, bi ura kazala današnji datum, časovna točka pa bi izgubila zamik |
| Plavajoča vejica z natančnostjo v bitih (24, 53) | Tako NUM_PREC_RADIX šteje 2, kot pri gonilniku SQL Serverja |
Vrednosti kot besedilo in brez ciljnega tipa. Če aplikacija stolpec s Store.Type bere kot besedilo
(SQL_C_CHAR, SQL_C_WCHAR), dobi obliko ODBC Driver 18: decimalnih mest ure ali časovne točke
vedno toliko, kolikor jih določa stolpec (00:00:00.0000000 pri time(7), .000 pri datetime),
časovno točko z zamikom (2026-10-29 13:45:12.1234567 +02:00) in decimalno število z vsemi
decimalnimi mesti in brez ničle pred decimalno piko (-.0000000001, .500). Brez lastnega ciljnega tipa
(SQL_C_DEFAULT) gonilnik vrne time in datetimeoffset kot strukturo gonilnika SQL Serverja
(SQL_SS_TIME2_STRUCT, 12 bajtov; SQL_SS_TIMESTAMPOFFSET_STRUCT, 20 bajtov), tip CLR kot bajte in
sql_variant kot ozko besedilo. Če aplikacija datetimeoffset zahteva kot časovno točko, datum ali
uro, ga gonilnik preračuna v krajevni čas računalnika, kot ODBC Driver 18.
Aplikacije ODBC 2. Če se aplikacija prijavi z ODBC 2 (SQL_ATTR_ODBC_VERSION), kot to stori
Access, gonilnik datum, uro in časovno točko navede s številkami ODBC 2 (SQL_DATE, SQL_TIME,
SQL_TIMESTAMP). Če poizveduje po vrednosti brez lastnega ciljnega tipa (SQL_C_DEFAULT), gonilnik
bigint in GUID vrne kot besedilo: ODBC 2 za oba kot privzetega ne pozna lastnega tipa C; za GUID
se ODBC Driver 18 vede enako.
Pretvorbe. SQLGetInfo(SQL_CONVERT_FUNCTIONS) ne javi nobene funkcije pretvorbe; CONVERT in
CAST ne spadata v prevedeno podmnožico in se izvedeta samo prek naslova za lastne stavke. Za
SQL_CONVERT_NUMERIC javi pretvorbo v SQL_NUMERIC, da ADO.NET decimalne vrednosti veže kot
število in ne kot besedilo v kulturi računalnika.