Om du migrerar dina Access-data till SQL Server eller skapar en Access-lösning med SQL Server som backend-databas är det viktigt att du känner till skillnaderna mellan Access SQL och SQL Server Transact SQL (TSQL). I den här artikeln beskrivs viktiga skillnader som du behöver känna till så att din lösning fungerar som den ska.
Mer information finns i Access SQL: grundläggande begrepp, ordlista och syntax och Transact-SQL Referens.
Skillnader i syntax och uttryck
Det finns några skillnader i syntax och uttryck som kräver konvertering. I följande tabell sammanfattas de vanligaste.
Skillnad |
Access SQL |
SQL Server TSQL |
Attribut för relationsdatabas |
Kallas vanligtvis för ett fält |
Kallas vanligtvis för kolumn |
Strängliteral |
Citat ("), t.ex. "Mira Magnusson" |
Apostrof ('), t.ex. 'Mira Magnusson'. |
Datumformat |
Nummertecken (#), t.ex. #1/1/2019# |
Apostrof ('), t.ex. '1/1/2019' |
Flera jokertecken |
Asterisk (*), t.ex. "Sofie*" |
Procent (%), t.ex. 'Sofie%' |
Enskilt jokertecken |
Frågetecken (?), t.ex. "Sofie?" |
Understreck (_), t.ex. "Sofie_" |
Modulo-operator |
MOD-operator, t.ex. Värde1 MOD Värde2 |
Procent (%), t.ex. Värde1 % Värde2 |
Booleska värden |
WHERE Bitvalue = [Sant | Falskt] Eller WHERE Bitvalue = [-1 | 0] |
WHERE Bitvalue = [1 | 0] |
Parametrar |
[<Ett namn som inte är en definierad kolumn>] Eller Använd deklarationen för SQL-parametrar i SQL-vyn |
@ParamName |
Kommentarer
-
I Access används citattecken (") runt tabellnamn och objekt. I T-SQL kan de användas för tabellnamn med blanksteg, men det är inte en standardmetod för namngivning. I de flesta fall bör nya namn utan blanksteg anges för objektnamn, men frågor måste också skrivas om för att avspegla nya tabellnamn. Använd hakparenteser [] för tabeller som du inte kan byta namn på men som inte överensstämmer med namngivningsstandarder. Access lägger även till extra parenteser runt parametrar i frågor, men de kan tas bort i T-SQL.
-
Överväg att använda det kanoniska datumformatet yyyy-mm-dd hh:nn:ss. Det är en ODBC-standard för datum som lagras som tecken som gör att de kan visas på ett konsekvent sätt i databaser och som bevarar sorteringsordningen för datum.
-
Om du vill undvika förvirring när du jämför booleska värden kan du använda följande jämförelse för Access och SQL Server:
-
Test för falskt värde WHERE Bitvalue = 0
-
Test för sant värde WHERE Bitvalue <> 0
-
Null-värden
Ett null-värde är inte ett tomt fält som innebär "inget värde alls". Ett null-värde är en platshållare som innebär att data saknas eller är okända. Databassystem som använder null-värden tillämpar ”trevärd logik”, vilket innebär att något kan vara sant, falskt eller okänt. Om du inte hanterar null-värden korrekt kan du få felaktiga resultat när du gör likhetsjämförelser eller undersöker WHERE-satser. Här är en jämförelse av hur Access och SQL Server hanterar null-värden.
Inaktivera null-värden i en tabell
I Access och SQL Server är null-värden aktiverade som standard. Om du vill inaktivera null-värden i en tabellkolumn gör du så här:
-
I Access ställer du in egenskapen Obligatorisk för ett fält till Ja.
-
I SQL Server lägger du till attributet NOT NULL i en kolumn i ett CREATE TABLE-uttryck.
Test för null-värden i en WHERE-sats
Använd jämförelsepredikaten IS NULL och IS NOT NULL:
-
Använd IS NULL eller IS NOT NULL i Access. Till exempel:
SELECT … WHERE column IS NULL.
-
Använd IS NULL eller IS NOT NULL i SQL Server. Till exempel:
SELECT … WHERE field IS NULL
Konvertera null-värden med funktioner
Använd null-funktionerna för att skydda dina uttryck och returnera alternativa värden:
-
I Access använder du funktionen NZ (värde; [värdeomnull]) som returnerar 0 eller ett annat värde. Till exempel:
SELECT AVG (NZ (Weight, 50) ) FROM Product
-
I SQL Server använder du funktionen ISNULL (värde, ersättningsvärde) som returnerar 0 eller ett annat värde. Till exempel:
SELECT AVG (ISNULL (Weight, 50)) FROM Product
Förstå databasalternativ
Vissa databassystem har specifika mekanismer:
-
I Access finns det inga databasalternativ som gäller null.
-
I SQL Server kan du använda alternativet SET ANSI_NULLS OFF för direkta likhetsjämförelser med NULL med operatorerna = och <>. Vi rekommenderar att du inte använder det här alternativet eftersom det är föråldrat och kan förvirra andra som använder ISO-kompatibel null-hantering.
Konvertering och omvandling
När du arbetar med data eller programmering finns det ett ständigt behov att konvertera från en datatyp till en annan. Processen för konvertering kan vara enkel eller komplicerad. Vanligt förekommande problem som du måste tänka på är: implicit eller explicit konvertering, aktuella nationella inställningar för datum och tid, avrundning och trunkering av tal och datatypstorlekar. Det finns inget som kan ersätta noggrann testning och bekräftelse av resultaten.
I Access använder du funktioner för typkonvertering. Det finns elva stycken, en för varje datatyp. Om du till exempel vill konvertera ett flyttal till en sträng:
CStr(437.324) returns the string "437.324".
I SQL Server använder du främst TSQL-funktionerna CAST och CONVERT. Det finns även andra konverteringsfunktioner för särskilda behov. Om du till exempel vill konvertera ett flyttal till en sträng:
CONVERT(TEXT, 437.324) returns the string "437.324"
Funktionerna DateAdd, DateDiff samt DatePart
De här vanliga datumfunktionerna liknar varandra (DatumLäggTill och DateAdd, DatumDiff och DateDiff samt DatumDel och DatePart) i Access och TSQL, men användningen av det första argumentet skiljer sig åt.
-
I Access kallas det första argumentet intervall, och det är ett stränguttryck som kräver citattecken.
-
I SQL Server kallas det första argumentet för datepart, och nyckelordsvärden som inte kräver citattecken används.
Komponent
Access
SQL Server
År
"åååå"
year, yy, yyyy
Kvartal
"q"
quarter, qq, q
Månad
"m"
month, mm, m
Dag på år
"å"
dayofyear, dy, y
Dag
"d"
day, dd, d
Vecka
"vv"
wk, ww
Dag i vecka
"v"
weekday, dw
Timme
"t"
hour, hh
Minut
"n"
minute, mi, n
Sekund
"s"
second, ss, s
Millisekund
millisecond, ms
Jämförelse av funktioner
Access-frågor kan innehålla beräknade kolumner som ibland använder Access-funktioner för att få resultat. När du migrerar frågor till SQL Server måste du ersätta Access-funktionen med en motsvarande TSQL-funktion om en sådan finns tillgänglig. Om det inte finns någon motsvarande TSQL-funktion kan du oftast skapa en beräknad kolumn i TSQL för att göra det du vill. TSQL har ett brett utbud av funktioner, och det är bra att se vad som finns tillgängligt. Mer information finns i artikeln om vad SQL-databasfunktioner är.
I följande tabell visas vilken Access-funktion som har en motsvarande TSQL-funktion.
Kategori i Access |
Access-funktion |
TSQL-funktion |
Konvertering |
||
Konvertering |
||
Konvertering |
||
Konvertering |
||
Konvertering |
||
Konvertering |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Datum/tid |
||
Mängdfunktioner för domäner |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Matematik |
||
Programflöde |
||
Programflöde |
||
Statistik |
||
SQL-mängdfunktioner |
||
SQL-mängdfunktioner |
||
SQL-mängdfunktioner |
||
SQL-mängdfunktioner |
||
SQL-mängdfunktioner |
||
Text |
||
Text |
||
Text |
||
Text |
||
Text |
||
Text |
||
Text |
||
Text |
||
Text |