SQL Server データベースにリンク テーブルにアクセスすると、"#Deleted" が返されます

症状:

1 つ以上の datetime 列または datetime2 列を含み、Microsoft SQL Server データベースに接続され、互換性レベルが 130 以上 (SQL Server 2016 の互換性レベル) を持つMicrosoft Accessリンク テーブルは、結果に #Deleted を返します。

レコードの変更をリンク テーブルにコミットしようとすると、次の "書き込み競合" メッセージが表示される場合もあります。

このレコードは、編集を開始してから別のユーザーによって変更されています。

原因

この問題は、 datetime 列または datetime2 列に秒の小数部の値が含まれているために発生します。 datetime2 型の秒の小数部の処理方法は、2016 年Microsoft SQL Server以降に変更されました。 変更の詳細については、次の記事を参照してください。

Note

SQL Server ODBC ドライバーは、データをサーバーに送信するときに datetime を datetime2 に変換するため、datetime データ型も datetime2 への変更の影響を受けます。

Resolution

Access では、Microsoft 365 Apps バージョン 2010 以降、新しい日付/時刻拡張データ型が導入されます。

SQL との構文の互換性を向上させ、日付と時刻を含むレコードの精度と詳細レベルを高めるために、Microsoftは Access で DateTime2 データ型を実装しています。 このデータ型には、より大きな日付範囲 (0001-01-01 ~ 9999-12-31) が含まれます。これは、時間の精度が向上します (秒ではなくナノ秒)。 DateTime2 データ型を有効にするには、新しいフィールド>Date & Time Extended を選択します。 詳細については、「 日付/時刻拡張データ型の使用」を参照してください。

Note

日付とTime Extended データ型は、以前のバージョンのMicrosoft Accessと互換性がありません。 その結果、データ型がローカルの Access テーブル内に実装されていて、この機能を含まない以前のバージョンで Access データベースが使用されている場合、データベースを開くことはありません。

リンクおよびインポート操作の 日付と時刻の拡張 データ型を有効または無効にするには、[Current Database Access]\( 現在のデータベース アクセス\) オプション [ Support Date Time Extended (DateTime2) Data Type for Linked/lmported Tables] を使用します。 詳細については、「カレント データベースのユーザー オプションを設定する」を参照してください。

以前のバージョンの Access では、次のいずれかの方法を使用してこの問題を回避します。

  • SQL Server データベースの互換性レベルを 120 (SQL Server 2014 の互換性レベル) 以下に変更します。
  • datetime 列と DateTime2 列が主キーの一部でないことを確認します。
  • timestamp または rowversion データ型を使用して、テーブルに新しい列を追加します。
  • UPDATE ステートメントを使用して datetime 列から秒の小数部を削除します。
  • データ型を datetime から smalldatetime に変更します。 注記: これにより、値は直近の分単位に丸められます。
  • データを編集する必要がない場合は、クエリを作成し、 RecordsetType プロパティを Snapshot に変更すると、この問題の影響を受けない読み取り専用レコードセットが返されます。

Note

Access のリンク テーブル マネージャーを使用して、SQL Serverでデザインが変更されたときにリンク テーブルを参照します。