Access データを SQL Server に移行する場合、またはバックエンド データベースとして SQL Server を使用して Access ソリューションを作成する場合、Access SQL と SQL Server の Transact SQL (TSQL) の違いを理解することが重要です。 ソリューションが意図したとおりに動作するように、知っておくべき重要なバリエーションを次に示します。
詳細については、「Access SQL: 基本的な概念、用語、および構文」および「Transact-SQL 参照」を参照してください。
構文と式の違い
変換する必要がある構文と式の違いがいくつかあります。 次の表は、最も一般的なものをまとめたものです。
差異 |
Access SQL |
SQL Server TSQL |
リレーショナル データベースの属性 |
通常フィールドと呼ばれる |
通常フ列と呼ばれる |
文字列リテラル |
"Mary Q. Contrary" のような引用符 (") |
'Mary Q. Contrary' のようなアポストロフィ (') |
日付リテラル |
#1/1/2019# のようなシャープ記号 (#) |
'1/1/2019' のようなアポストロフィ (') |
複数のワイルドカード文字 |
"Cath*" のようなアスタリスク (*) |
'Cath%' のようなパーセント (%) |
単一のワイルドカード文字 |
"Cath?" のような疑問符 (?) |
"Cath_" のようなアンダースコア (_) |
剰余演算子 |
Value1 MOD Value2 のような MOD 演算子 |
Value1 % Value2 のようなパーセント (%) |
ブール値 |
WHERE Bitvalue = [True | False] または WHERE Bitvalue = [-1 | 0] |
WHERE Bitvalue = [1 | 0] |
パラメーター |
[< 定義された列ではない名前 >] または SQL ビューでは、SQL パラメーター宣言を使用 |
@ParamName |
メモ
-
Access では、テーブル名とオブジェクトを囲む引用符 (") を使用します。 T-SQL は、スペースを含むテーブル名に使用することができますが、標準の命名法ではありません。 ほとんどの場合、オブジェクト名はスペースなしで名前を変更する必要がありますが、クエリも新しいテーブル名を反映するように書き換える必要があります。 名前を変更できないが、命名標準に準拠していないテーブルには、角かっこ [ ] を使用します。 Access では、クエリ内のパラメーターを囲むかっこも追加されますが、T-SQL では削除できます。
-
正規日付形式である yyyy-mm-dd hh:nn:ss を使用することを検討してください。これは、文字として保存された日付の ODBC 標準であり、データベース間でそれらを表現する一貫した方法を提供し、日付の並べ替え順序を保持します。
-
ブール値を比較するときの混乱を避けるために、Access と SQL Server の次の比較を使用できます。
-
False 値のテスト WHERE Bitvalue = 0
-
True 値のテスト WHERE Bitvalue <> 0
-
Null 値
Null 値は、「値なし」という意味の空のフィールドではありません。 Null 値は、データが見つからないか、不明であることを示すプレースホルダーです。 Null 値が認識されているデータベースシステムは、「3値論理」を実装します。つまり、何かが true、false、または不明である可能性があります。 Null 値を正しく処理しないと、等式比較や WHERE 句の評価で誤った結果を返すことがあります。 Access と SQL Server が Null 値を処理する方法を比較します。
テーブルの Null 値を無効にする
Access と SQL Server では、既定値として Null 値が有効になっています。 テーブルの列の Null 値を無効にするには、次の操作を行います。
-
Access で、フィールドの [必須] プロパティを [はい] に設定します。
-
SQL Server で、CREATE TABLE ステートメントの列に NOT NULL 属性を追加します。
WHERE 句で Null 値をテストする
IS NULL および IS NOT NULL 比較述語を使用する:
-
Access で、IS NULL または IS NOT NULL を使用します。 次に例を示します。
SELECT … WHERE column IS NULL.
-
SQL Server で、IS NULL または IS NOT NULL を使用します。 次に例を示します。
SELECT … WHERE field IS NULL
関数を使用して Null 値を変換する
Null 関数を使用して式を保護し、代替値を返します。
-
Access で、0 または別の値を返す NZ (value, [valueifnull]) 関数を使用します。 次に例を示します。
SELECT AVG (NZ (Weight, 50) ) FROM Product
-
SQL Server で、0 または別の値を返す ISNULL (Value, replacement_value) 関数を使用します。 次に例を示します。
SELECT AVG (ISNULL (Weight, 50)) FROM Product
データベース オプションを理解する
データベース システムによっては、固有のメカニズムがあります。
-
Access では、Null に関連するデータベース オプションはありません。
-
SQL Server では、= および <> 演算子を使用して、SET ANSI_NULLS OFF オプションを使用して、NULL と直接等式比較できます。 このオプションは廃止されるため、使用しないことをお勧めします。また、ISO に準拠して Null を処理している他のユーザーが混乱する可能性があります。
変換とキャスト
データやプログラミングを使用している場合は、常にあるデータ型から別のデータ型に変換する必要があります。 変換処理は、単純なものから複雑なものまであります。 考慮する必要がある一般的な問題は、暗黙的または明示的な変換、現在の日時の地域設定、数値の四捨五入または切り捨て、およびデータ型のサイズです。 徹底的なテストと結果の確認に代わるものはありません。
Access では、データ型ごとに 1 つずつ、文字 C で始まる 11 個あるデータ型変換関数を使用します。 たとえば、浮動小数点数を文字列に変換するには、次のようにします。
CStr(437.324) returns the string "437.324".
SQL Server では、主に キャストおよび変換 TSQL 関数を使用しますが、特別なニーズのための変換関数は他にもあります。 たとえば、浮動小数点数を文字列に変換するには、次のようにします。
CONVERT(TEXT, 437.324) returns the string "437.324"
DateAdd、DateDiff、および DatePart 関数
これらの一般的に使用される日付関数は、Access と TSQL ではよく似ていますが (DateAdd、DateDiff、およびDatePart)、最初の引数の使用方法は異なります。
-
Access では、最初の引数は interval と呼ばれ、引用符が必要な文字列式です。
-
SQL Server では、最初の引数は datepart と呼ばれ、引用符を必要としないキーワード値を使用します。
コンポーネント
Access
SQL Server
年
"yyyy"
year, yy, yyyy
四半期
"q"
quarter, qq, q
月
"m"
month, mm, m
年間通算日
"y"
dayofyear, dy, y
日
"d"
day, dd, d
週
"ww"
wk, ww
曜日
"w"
weekday, dw
時間
"h"
hour, hh
分
"n"
minute, mi, n
秒
"s"
second, ss, s
ミリ秒
millisecond, ms
関数の比較
Access クエリには、関数を使用して結果を取得することがある計算列を含めることができます。 クエリを SQL Server に移行するとき、Access 関数を使用できる場合は、同等の TSQL 関数に置き換える必要があります。 対応する TSQL 関数が存在しない場合は、通常計算列 (集計列で使用される TSQL 用語) を作成して、目的の操作を実行できます。 TSQL には幅広い関数が用意されています。何が使用できるのかを確認することをお勧めします。 詳細については、「 SQL データベースの関数とは何ですか?」を参照してください。
次の表は、対応する TSQL 関数を持つ Access 関数を示しています。
Access カテゴリ |
Access 関数 |
TSQL 関数 |
変換 |
||
変換 |
||
変換 |
||
変換 |
||
変換 |
||
変換 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
日付/時刻型 |
||
定義域集計 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
計算 |
||
プログラム フロー |
||
プログラム フロー |
||
統計 |
||
SQL 集合関数 |
||
SQL 集合関数 |
||
SQL 集合関数 |
||
SQL 集合関数 |
||
SQL 集合関数 |
||
文字列 |
||
テキスト |
||
テキスト |
||
テキスト |
||
テキスト |
||
テキスト |
||
テキスト |
||
テキスト |
||
テキスト |