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

現象

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

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

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

原因

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

注:

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

解決方法

Access では、Microsoft 365 Apps バージョン 2010 以降で新しく強化された Date & Time Extended データ型が導入されています。

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

注:

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

リンクおよびインポート操作の Date & Time Extended データ型を有効または無効にするには、[ 現在のデータベース アクセス] オプション [リンクされたテーブル /lmported テーブルに対して DateTime Extended (DateTime2) データ型をサポートする] オプションを使用します。 詳細については、「現在の データベースのユーザー オプションを設定する」を参照してください。

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

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

注:

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