2016-08-09 22 views
4

一時テーブルProductを使用してSQL Server 2016データベースを作成しました。私はリンクテーブルを介してAccessデータベースからテーブルを更新したいと思います。SQL Server 2016一時テーブルをAccessから更新することはできますか?

CREATE TABLE [dbo].[Product] 
(
    [Product] [uniqueidentifier] NOT NULL, 
    CONSTRAINT PK_Product_Product PRIMARY KEY CLUSTERED (Product), 
    [Name] [nchar](50) NOT NULL, 
    CONSTRAINT [AK_Product_Name] UNIQUE([Product line], [Name]), 
    [Status] [uniqueidentifier] NOT NULL, 
    SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL, 
    SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL, 
    PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)  
) ON [PRIMARY] WITH  
    ( 
     SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProductHistory) 
    ) 
GO 

クエリ:テーブルは次のように定義されて

このエラーのエラーメッセージがない:これを行うにしようとすると、アクセスが

予約エラー(-7776)が報告します

UPDATE Product 
SET Status = (SELECT [Product status] 
       FROM [Product status] 
       WHERE [Name] = 'Announced') 
WHERE [Name] = 'A300'; 

はエラーなしで成功し、アクセステーブルに表示されます。更新は履歴テーブルに正しく反映されます。

バックエンドの変更によって問題が発生したものの、効果がない場合に有効な時刻の列が表示されないようにしました。 ProductProduct statusの両方の表には最小限のデータが含まれています。

これを機能させるための具体的な方法はありますか、このシナリオはサポートされていませんか?

+1

一時テーブルへのODBCリンクは、SQL Serverの最新のODBCドライバを使用していますか? –

+0

問題のある列を使わずにこのテーブルのビューを作成し、Accessのリンクをリンクしてそこのレコードを更新しようとするとよいでしょう。 – Andre

+0

@Gord SQL Server 2016の新しいインストールでインストールされた「SQL ServerネイティブクライアントRDA 11.0.」を使用します。 – Pekka

答えて

2

datetime2(7)列の既定の精度は、Accessで使用できる精度を超えています。精度がdatetime2(3)に減少すると、クエリは更新可能になります。

小数点以下2桁を少し上回る可能性があるため、これも高すぎる可能性があります。表をリンクするとき、有効な表現が列を表現するには不十分であることを示すメッセージは報告されません。次いで不足精度の失敗 -

SQL Serverプロファイラからの次の更新が

以下は更新前の行の値を示す
exec sp_executesql N'UPDATE "dbo"."Product" 
    SET "Product status"[email protected] 
    WHERE "Product line" = @P2 AND "Product" = @P3 AND 
     "Name" = @P4 AND "Product status" = @P5 AND "SysStartTime" = @P6 AND 
     "SysEndTime" = @P7', 
    N'@P1 uniqueidentifier,@P2 uniqueidentifier,@P3 uniqueidentifier,@P4 nvarchar(50),@P5 uniqueidentifier,@P6 datetime2,@P7 datetime2', 
    '3C...1E4B','38...2883','8E...0387',N'A300','44...6B76','2016-08-09 21:43:07.8710000','2016-08-09 22:45:59.1340000' 

有効時間フィールドの値に問題を示しアクセス列の

Product line Product Name Product status SysStartTime    SysEndTime 
38...2883 8E...0387 A300 44...6B76  2016-08-09 21:43:07.8709730 2016-08-09 22:45:59.1342223 

これは、Rows showing as #DELETEDのBIGINT列の範囲の問題に関連しています。より新しいSQL Serverタイプの包括的なマッピングが役立ちます。

GUIDは、出力をより読みやすくするために部分的に省略されています。

+1

この生成されたUPDATE sqlは奇妙です。すべての列をWHERE節に入れます。リンクテーブルのテーブルデザインを開いたときにAccessがプライマリキーを認識しますか? – Andre

+0

@Andreはい、主キーが正しく検出されています。この更新プログラムは、[[ODBCテーブルの#Deleted]エラー(https://support.microsoft.com/en-us/kb/128809)フォールバック]のように表示され、更新の正確性を検証します。 – Pekka

関連する問題