Barvna shema: Temna
Trenutno dejavna stran: start » sl » Dokumentacija » Integracija podatkov in dostop do podatkov » Gonilnik WKL OData ODBC » Referenčni priročnik gonilnika OData ODBC » Podprti SQL

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

SQLOData
=, <>, <, <=, >, >=, IS NULL, IS NOT NULLeq, ne, lt, le, gt, ge, eq null, ne null
stolpec proti stolpcu iste tabele (C.ParentId = C.Id), tudi pod aliasom imena tabeleParentId eq Id; stolpce različnih družin tipov (število proti besedilu) gonilnik zavrne. Potrebuje storitev, ki sprejme primerjavo polja s poljem
AND, OR, NOT, oklepajiand, 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šljeGonilnik 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") DESCisti 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.

PraviloRazlog
OFFSET samo za ORDER BY; ROW/ROWS, FIRST/NEXT enakovredni; FETCH lahko manjkakot v SQL Serverju: brez urejenosti ni stalnega položaja
vrednosti kot celo število ali parameter (?); OFFSET od 0, FETCH od 1kar zavrne SQL Server (napaka 10742, 10744), zavrne tudi gonilnik
TOP poleg OFFSET se zavrneSQL Server tak stavek prav tako zavrne (napaka 10741)
stavki z združevanjem v skupine (GROUP BY, DISTINCT) listajo enakostoritev skupine po $apply lista s $skip/$top
SQL_ATTR_MAX_ROWS dodatno omeji FETCHkot pri TOP
COUNT(*) s pogojem – tudi pogoj ranga za položaj zapisa – ostane $count; COUNT(*) AS name ohrani imestolpec 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

  • LIKE deluje samo v oblikah x%, %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 SQLGetInfo ne 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 tipa Guid oziroma 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

SQLSTATEPogoj
42000stavka ni mogoče prevesti in ni naslova za lastne stavke; sporočilo navede razlog, na primer stolpec ali konstrukt

Glejte tudi

sl/wiki/data-conectivity/odata-odbc/reference/supported-sql.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille