ms-access – 是否可以从Access更新SQL Server 2016时态表?

我创建了一个带有时态表Product的SQL Server 2016数据库.我想通过链接表从Access数据库更新表.尝试执行此操作时,Access报告

Reserved error (-7776): there is no error message for this error

该表定义为:

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

查询

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

成功没有错误,并显示在Access表中.更新正确地反映在历史记录表中.

我已经尝试隐藏有效时间列,以防它们的后端更改导致问题,但没有任何效果.产品和产品状态表都包含最少的数据.

有没有一些特定的方法来使这个工作,或者这种情况不受支持?

最佳答案 datetime2(7)列中的默认精度超出了Access中可用的精度.当精度降低到datetime2(3)时,查询变得可更新.

即使这可能太高,因为可能只有超过2位数可用于小数秒.链接表时,不会报告任何消息以指示有效表示不足以表示列.

SQL Server Profiler的以下更新演示了有效时间字段的值中的问题

exec sp_executesql N'UPDATE "dbo"."Product" 
    SET "Product status"=@P1  
    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'

其中以下显示更新前行的值 – 由于Access列的精度不足而失败.

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以使输出更具可读性.

点赞