Jeśli przeprowadzasz migrację danych programu Access do programu SQL Server lub tworzysz rozwiązanie programu Access z programem SQL Server jako bazą danych zaplecza, ważne jest, aby poznać różnice między językami Access SQL i SQL Server Transact SQL (TSQL). Poniżej przedstawiono ważne odmiany, które należy znać, aby Twoje rozwiązanie działało zgodnie z oczekiwaniami.
Aby uzyskać więcej informacji, zobacz artykuły Język Access SQL: podstawowe pojęcia, słownictwo i składnia oraz Dokumentacja języka Transact-SQL.
Różnice składni i wyrażeń
Istnieje kilka różnic składni i wyrażeń, które wymagają konwersji. W poniższej tabeli podsumowano najczęściej spotykane.
Różnica |
Access SQL |
SQL Server TSQL |
Atrybut relacyjnej bazy danych |
Zwykle nazywany polem |
Zwykle nazywany kolumną |
Literały ciągów |
Cudzysłów ("), na przykład "Mary Q. Contrary" |
Apostrof ('), na przykład 'Mary Q. Contrary' |
Literały daty |
Znak numeru (#), na przykład #1/1/2019# |
Apostrof ('), na przykład '1/1/2019' |
Wielokrotne znaki wieloznaczne |
Gwiazdka (*), na przykład "Cath*" |
Procent (%), na przykład 'Cath%' |
Pojedyncze symbole wieloznaczne |
Znak zapytania (?), na przykład "Cath?" |
Znak podkreślenia (_), na przykład "Cath_" |
Operator modulo |
Operator MOD, na przykład wartość1 MOD wartość2 |
Procent (%), na przykład Wartość1 % Wartość2 |
Wartości logiczne |
WHERE Bitvalue = [True | False] Lub WHERE Bitvalue = [-1 | 0] |
WHERE Bitvalue = [1 | 0] |
Parametry |
[<Nazwa, która nie jest zdefiniowaną kolumną>] Lub W widoku SQL użyj deklaracji parametrów SQL |
@ParamName |
Uwagi
-
W programie Access są używane znaki cudzysłowu (") wokół nazw tabel i obiektów. Język T-SQL może używać ich do nazw tabel zawierających spacje, ale nie jest to standardowe postępowanie nazewnictwa. W większości przypadków nazwa obiektu powinna zostać zmieniona na niezawierającą spacji, ale w celu odzwierciedlenia nowych nazw tabel należy również ponownie napisać zapytania. W przypadku tabel, których nazw nie można zmienić i które nie są zgodne ze standardami nazewnictwa, należy użyć nawiasów kwadratowych [ ]. Program Access dodaje także dodatkowe nawiasy wokół parametrów w zapytaniach, jednak można je usuwać w języku T-SQL.
-
Rozważmy używanie kanonicznego formatu daty, rrrr-mm-dd gg: mm:ss, który jest standardem ODBC dla dat przechowywanych jako znaki i który zapewnia spójny sposób przedstawiania ich w bazach danych oraz zachowuje kolejność sortowania daty.
-
W celu uniknięcia nieporozumień podczas porównywania wartości logicznych możesz użyć poniższego porównania dla programów Access i SQL Server:
-
Test na wartość fałsz WHERE Bitvalue = 0
-
Test na wartość prawda WHERE Bitvalue <> 0
-
Wartości null
Wartość null to nie jest puste pole, które oznacza „brak jakiejkolwiek wartości”. Wartość null to symbol zastępczy, który oznacza, że brakuje danych lub są one nieznane. W systemach baz danych, które rozpoznają wartości null zaimplementowano „logikę trójwartościową”, co oznacza, że coś może mieć wartość prawda, fałsz lub mieć wartość nieznaną. Jeśli wartości null nie są poprawnie obsługiwane, możesz uzyskać nieprawidłowe wyniki podczas porównywania równości lub oceniania klauzul WHERE. Poniżej przedstawiono porównanie tego, jak w programach Access i SQL Server są obsługiwane wartości null.
Wyłączanie wartości null w tabeli
w programach Access i SQL Server domyślnie wartości null są włączone. Aby wyłączyć wartości null w kolumnie tabeli, wykonaj następujące czynności:
-
W programie Access ustaw właściwość Wymagana pola na wartość Tak.
-
W programie SQL Server dodaj atrybut NOT NULL do kolumny w instrukcji CREATE TABLE.
Sprawdzanie wartości null w klauzuli WHERE
Należy użyć predykatów porównania IS NULL i IS NOT NULL:
-
W programie Access użyj predykatów IS NULL lub IS NOT NULL. Przykłady:
SELECT … WHERE column IS NULL.
-
W programie SQL Server należy używać predykatów IS NULL lub NOT NULL. Przykłady:
SELECT … WHERE field IS NULL
Konwertowanie wartości null za pomocą funkcji
Użyj funkcji null w celu ochrony wyrażeń i zwrócenia wartości alternatywnych:
-
W programie Access należy użyć funkcji NZ (wartość, [wartość_jeśli_null]), która zwraca wartość 0 lub inną wartość. Przykłady:
SELECT AVG (NZ (Weight, 50) ) FROM Product
-
W programie SQL Server należy użyć funkcji ISNULL (Wartość, wartość_zastępcza) zwracającej wartość 0 lub inną wartość. Przykłady:
SELECT AVG (ISNULL (Weight, 50)) FROM Product
Opis opcji bazy danych
W niektórych systemach baz danych są dostępne mechanizmy własnościowe:
-
W programie Access nie ma żadnych opcji bazy danych odnoszących się do wartości null.
-
W programie SQL Server możesz użyć opcji SET ANSI_NULLS OFF, aby uzyskać bezpośrednie porównania równości z wartością NULL przy użyciu operatorów = i <>. Zalecamy, aby unikać korzystania z tej opcji, ponieważ jest ona przestarzała i może mylić inne osoby korzystające z obsługi wartości null zgodnej z ISO.
Konwersja i rzutowanie
Za każdym razem, gdy pracujesz z danymi lub oprogramowaniem, występuje stała konieczność konwertowania jednego typu danych na inny. Proces konwersji może być prosty lub złożony. Typowe problemy, które należy wziąć pod uwagę, to: konwersja niejawna lub jawna, bieżące ustawienia regionalne daty i godziny, zaokrąglanie lub obcinanie liczb oraz rozmiary typów danych. Nie można pominąć dokładnego testowania i potwierdzania wyników.
W programie Access są używane funkcje konwersji typów, których jest jedenaście, przy czym każda z nich zaczyna się od litery C i dotyczy określonego typu danych. Na przykład w celu przeprowadzenia konwersji liczby zmiennoprzecinkowej na ciąg:
CStr(437.324) returns the string "437.324".
W programie SQL Server używasz głównie funkcji TSQL CAST i CONVERT, chociaż istnieją inne funkcje konwersji w przypadku specjalnych potrzeb. Na przykład w celu przeprowadzenia konwersji liczby zmiennoprzecinkowej na ciąg:
CONVERT(TEXT, 437.324) returns the string "437.324"
funkcje DateAdd, DateDiff i DatePart
Te powszechnie używane funkcje daty są podobne (DateAdd, DateDiff i DatePart) w programie Access i języku TSQL, ale zastosowanie pierwszego argumentu się różni.
-
W programie Access pierwszy argument jest nazywany interval i jest to wyrażenie ciągu wymagające cudzysłowu.
-
W programie SQL Server pierwszy argument jest nazywany datepart i używa wartości słów kluczowych, które nie wymagają cudzysłowu.
Składnik
Access
SQL Server
Rok
"rrrr"
rok, rr, rrrr
Kwartał
"k"
kwartał, kk, k
Miesiąc
"m"
miesiąc, mm, m
Dzień roku
"y"
dzień_roku, dy, y
Dzień
"d"
dzień, dd, d
Tydzień
"ww"
wk, ww
Dzień tygodnia
"w"
dzień tygodnia, dw
Godzina
"g"
godzina, gg
Minuta
"n"
minuta, mi, n
Sekunda
"s"
sekunda, ss, s
Milisekunda
milisekunda, ms
Porównanie funkcji
Zapytania programu Access mogą zawierać kolumny obliczeniowe, które czasami używają funkcji programu Access do uzyskiwania wyników. Jeśli przeprowadzasz migrację zapytań do programu SQL Server, musisz zastąpić funkcję programu Access na podobną funkcję języka TSQL, jeśli jest ona dostępna. Jeśli nie ma odpowiadającej funkcji TSQL, wówczas możesz zwykle utworzyć kolumnę obliczaną (termin języka TSQL użyty dla kolumny obliczeniowej), aby zrobić to, co chcesz. Język TSQL zawiera szeroką gamę funkcji i warto sprawdzić, co jest dostępne. Aby uzyskać więcej informacji, zobacz Jakie są funkcje bazy danych SQL?.
W poniższa tabela pokazuje, która funkcja programu Access ma odpowiadającą jej funkcję języka TSQL.
Kategoria programu Access |
Funkcja programu Access |
Funkcja języka TSQL |
Konwersja |
||
Konwersja |
||
Konwersja |
||
Konwersja |
||
Konwersja |
||
Konwersja |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Data/Godzina |
||
Agregat domeny |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Matematyka |
||
Przepływ sterowania programu |
||
Przepływ sterowania programu |
||
Statystyczne |
||
Agregat SQL |
||
Agregat SQL |
||
Agregat SQL |
||
Agregat SQL |
||
Agregat SQL |
||
Tekst |
||
Tekst |
||
Tekst |
||
Tekst |
||
Tekst |
||
Tekst |
||
Tekst |
||
Tekst |
||
Tekst |