Podprti SQL
Ta referenčna stran opisuje, katere stavke SQL gonilnik prevede v zahteve OData, kako jih prevede in kaj zavrne. Potrebujete jo, ko poizvedba iz Accessa, ADO.NET ali VBA ne deluje po pričakovanjih ali ko želite poizvedbo napisati tako, da deluje brez lastnih stavkov. Pregled daje koncept Kako gonilnik prevaja stavke. Katere množice in stolpci sploh obstajajo in od kod izvirajo njihovi tipi, je opisano najprej v Kako iz storitve OData nastane relacijski model ODBC.
Sintaksa
SELECT <stolpci | agregati> FROM <množica> [WHERE <pogoj>] [GROUP BY <stolpci> [HAVING <pogoj>]] [ORDER BY <stolpci> [OFFSET n ROWS [FETCH NEXT m ROWS ONLY]]] INSERT INTO <množica> (…) VALUES (…) UPDATE <množica> SET … WHERE <ključ> = ? [AND <različica-vrstice> = ?] DELETE FROM <množica> WHERE <ključ> = ? [AND <različica-vrstice> = ?]
Preveden stavek bere natanko eno množico entitet. Vse drugo se pošlje na naslov za lastne stavke ali se zavrne.
Parametri
Pogoji
| SQL | OData |
|---|---|
=, <>, <, <=, >, >=, IS NULL, IS NOT NULL | eq, ne, lt, le, gt, ge, eq null, ne null |
stolpec proti stolpcu iste tabele (C.ParentId = C.Id), tudi pod aliasom imena tabele | ParentId eq Id; stolpce različnih družin tipov (število proti besedilu) gonilnik zavrne. Potrebuje storitev, ki sprejme primerjavo polja s poljem |
AND, OR, NOT, oklepaji | and, or, not, oklepaji |
IN (…), NOT IN (…) | veriga pogojev or, pri NOT IN zanikana |
LIKE 'x%', '%x', '%x%' | startswith, endswith, contains |
LIKE z znakom v oglatih oklepajih ('B[_]%') | znak sam, kot v SQL Serverju |
parameter ? | vezana vrednost, kot literal v filtru |
Združevanje v skupine in povzemanje
Access vsote in skupine nad povezano tabelo pošlje gonilniku, ne glede na to, kaj o njem javi
SQLGetInfo, in jih ne izračuna sam, če jih gonilnik zavrne – poizvedba se v tem primeru konča z
napako „ODBC–call failed“ (tudi z
SQL_ODBC_SQL_CONFORMANCE = 0). Z naslovom za lastne stavke
se pošljejo nespremenjene podatkovni zbirki. Brez njega jih gonilnik prevede v $apply (OData Data
Aggregation 4.0) – vendar samo, če dokument metapodatkov deklarira Org.OData.Aggregation.V1.ApplySupported s
potrebnimi transformacijami. Storitev brez te deklaracije bi na $apply v najboljšem primeru odgovorila
z napako, če pa neznano možnost prezre, z vrsticami brez združevanja, ki bi jih aplikacija imela za
skupine.
Access ne pošlje AVG, temveč SUM in COUNT(x) ter sam deli; za StDev in Var
dodatno SUM(x * x); TOP n ohrani; v ORDER BY stolpec navede s polnim imenom
("dbo"."Artikel"."Gruppe"), tudi znotraj agregata; združevanje po Year(…) izračuna sam nad
prebranim stolpcem.
| Access pošlje | Gonilnik zahteva |
|---|---|
SELECT SUM("x") FROM "dbo"."t" "R" | t?$apply=aggregate(x with sum as gw_a1) |
SELECT "g", COUNT(*) FROM … WHERE ("id" > 3) GROUP BY "g" ORDER BY "dbo"."t"."g" DESC | $apply=filter(id gt 3)/groupby((g),aggregate($count as gw_a1))&$orderby=g desc |
… GROUP BY "g" HAVING (COUNT(*) > 1) | $filter=gw_a1 gt 1 na skupine |
… HAVING SUM("b") >= ? (agregat ni izbran) | zahteva se kot gw_a1 in primerja, ne prikaže pa se kot stolpec |
… ORDER BY SUM("dbo"."t"."id") DESC | isti agregat kot v izbiri, $orderby=gw_a1 desc |
SELECT DISTINCT "g" FROM … | groupby((g)) |
SELECT COUNT("x"), SUM(("x" * "x")), SUM("x") FROM … | compute((x mul x) as gw_c1)/aggregate(x with Wkl.Store.V1.count as gw_a1,gw_c1 with sum as gw_a2,x with sum as gw_a3) |
SELECT COUNT(*) FROM … sam | še naprej $count – na to odgovori vsaka storitev |
COUNT(x) – vrednosti, ki ne manjkajo – protokol ne pozna kot standardne metode; gonilnik za to
uporabi Wkl.Store.V1.count, če ga storitev deklarira z Aggregation.CustomAggregationMethods, sicer
stavek zavrne. Aliase gw_aN in gw_cN izbere tako, da nobena lastnost množice nima takega imena.
Tipi stolpcev kot pri Microsoftovem gonilniku za SQL Server, da Access ustvari enaka polja:
število je int, vsota celih števil do int je int (pri večji vrednosti se poizvedba konča z
napako prekoračitve, kot tam), vsota vrednosti bigint je bigint, vsota decimalnih
števil decimal(38, s); MIN in MAX imata tip stolpca. Eno namerno odstopanje: povprečje celih
števil je float z decimalnimi mesti, kjer SQL
Server vrne celo število – storitev izračuna pravo povprečje, opis kot celo število pa bi odrezal
decimalna mesta, ki jih pošlje. Ime stolpca je njegov alias v stavku; brez aliasa
nima imena, kot pri ODBC Driver 18 (Access ga tedaj sam poimenuje Expr1000, Expr1001 …).
Zavrnjeno z 42000 namesto približnega prevoda: računanje med agregati (SUM(a) - SUM(b)), deljenje,
druge funkcije kot SUM, MIN, MAX, AVG, COUNT, stolpec v izbiri, ki ni združen v skupino,
DISTINCT v SUM ali AVG, parameter znotraj agregata, * poleg GROUP BY. Z naslovom za lastne
stavke se tudi to pošlje podatkovni zbirki.
Prevedena poizvedba z vsotami v Accessu vrne iste vrednosti in tipe polj kot prek Microsoftovega
ODBC Driver 18. Vsota, ki prekorači obseg int, se konča z napako kot tam.
Branje po straneh z OFFSET/FETCH
Aplikacija, ki velik rezultat prikazuje zaslon za zaslonom, vsako stran zahteva z obliko za listanje
SQL Serverja in standarda SQL. Gonilnik jo prevede brez naslova za lastne stavke: OFFSET n postane
$skip=n, FETCH NEXT m ROWS ONLY postane $top=m; pogoj in razvrščanje se kot običajno pošljeta
kot $filter in $orderby. Primer stavka, ki ga podatkovna mreža pošlje prek lastne povezave s
SQLExecDirect:
SELECT S."ID", S."Kunde", S."Umsatz" FROM "dbo"."Umsatz" S ORDER BY S."Umsatz" DESC, S."ID" OFFSET 500000 ROWS FETCH NEXT 200 ROWS ONLY
postane Umsatz?$select=ID,Kunde,Umsatz&$orderby=Umsatz desc,ID&$skip=500000&$top=200.
| Pravilo | Razlog |
|---|---|
OFFSET samo za ORDER BY; ROW/ROWS, FIRST/NEXT enakovredni; FETCH lahko manjka | kot v SQL Serverju: brez urejenosti ni stalnega položaja |
vrednosti kot celo število ali parameter (?); OFFSET od 0, FETCH od 1 | kar zavrne SQL Server (napaka 10742, 10744), zavrne tudi gonilnik |
TOP poleg OFFSET se zavrne | SQL Server tak stavek prav tako zavrne (napaka 10741) |
stavki z združevanjem v skupine (GROUP BY, DISTINCT) listajo enako | storitev skupine po $apply lista s $skip/$top |
SQL_ATTR_MAX_ROWS dodatno omeji FETCH | kot pri TOP |
COUNT(*) s pogojem – tudi pogoj ranga za položaj zapisa – ostane $count; COUNT(*) AS name ohrani ime | stolpec sicer nima imena in bralec, ki išče po imenu, ga ne bi našel |
Besede OFFSET, FETCH, ROWS, NEXT itd. gonilnik prepozna samo na koncu ORDER BY; stolpec z
imenom Next lahko še naprej uporabljate nespremenjeno.
Kako draga je globoka stran, odloči storitev s svojo podatkovno zbirko, ne gonilnik. Podatkovni
prehod Wkl.Data.Gateway iz $skip naredi OFFSET … ROWS, SQL Server pa za to prebere vse vrstice
pred njo. Pri plitvi strani gonilnik doda le stalni čas zahteve HTTP.
Vrnjena vrednost
Imena stolpcev so alias stavka; brez aliasa je ime prazno, kot pri ODBC Driver 18. Tipi stolpcev sledijo pravilom pod „Združevanje v skupine in povzemanje“.
Opombe
LIKEdeluje samo v oblikahx%,%x,%x%in brez_kot nadomestnega znaka. En znak v oglatih oklepajih ([_],[%]) ali za ubežnim znakom (ESCAPE) velja za ta znak in je dovoljen. Razred znakov, kot je[a-c]ali[^a], v OData nima ustreznice.- Izraze na seznamu polj gonilnik prevede samo znotraj agregata.
- Spojev in podpoizvedb
SQLGetInfone javlja kot podprtih; Access spoje kljub temu pošlje, izvedejo pa se samo prek naslova za lastne stavke. - Kazalec bere naprej, brez zaznamkov in brez zaklepanja.
- Vrednosti GUID (
uniqueidentifier,Edm.Guid): kot literal v zapisu Accessa ({guid {33333333-…}}), kot besedilo ali kot parameter tipaGuidoziroma kot 16 bajtov; storitvi se pošlje oblika OData v4 brez imena tipa. Za aplikacije ODBC 2, kot je Access, gonilnik GUID brez zahtevanega tipa vrne kot besedilo, kot ODBC Driver 18. To velja v Accessu za podatkovni list, obrazec, podobrazec in seznam za iskanje.
Primer
Access: SELECT ... FROM Artikel WHERE Gruppe = 'S' ORDER BY Nummer Storitev: GET .../Artikel?$filter=Gruppe eq 'S'&$orderby=Nummer&$select=...
Velja za
Gonilnik Wkl OData v 32- in 64-bitni različici; združevanje v skupine samo s storitvijo, ki
deklarira $apply (glejte Zahteve za storitev OData).
Izjeme
| SQLSTATE | Pogoj |
|---|---|
42000 | stavka ni mogoče prevesti in ni naslova za lastne stavke; sporočilo navede razlog, na primer stolpec ali konstrukt |