Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 是否可以从Access更新SQL Server 2016时态表?_Ms Access_Sql Server 2016_Temporal Database - Fatal编程技术网

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

Ms access 是否可以从Access更新SQL Server 2016时态表?,ms-access,sql-server-2016,temporal-database,Ms Access,Sql Server 2016,Temporal Database,我已经创建了一个SQL Server 2016数据库,其中包含一个时态表产品。我想通过链接表从Access数据库更新表。尝试执行此操作时,请访问报告 保留错误(-7776):此错误没有错误消息 该表定义如下: CREATE TABLE [dbo].[Product] ( [Product] [uniqueidentifier] NOT NULL, CONSTRAINT PK_Product_Product PRIMARY KEY CLUSTERED (Product),

我已经创建了一个SQL Server 2016数据库,其中包含一个时态表
产品
。我想通过链接表从Access数据库更新表。尝试执行此操作时,请访问报告

保留错误(-7776):此错误没有错误消息

该表定义如下:

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';
成功,无错误,并显示在访问表中。更新正确反映在历史记录表中

我尝试过隐藏有效的时间列,以防后端更改导致问题,但没有效果。
产品
产品状态
表都包含最少的数据


是否有某种特定的方法来实现此功能,或者此方案不受支持?

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'
其中,以下显示了更新前的行的值-由于访问列的精度不足,更新失败

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
这与中BIGINT列的范围问题有关。较新的SQL Server类型的全面映射将非常有用


guid已被部分删除,以使输出更具可读性。

到临时表的ODBC链接是否使用最新的SQL Server ODBC驱动程序?您可以尝试在此表上创建一个视图,而不使用有问题的列,将其链接到Access中,并尝试更新其中的记录。@Gord使用
SQL Server本机客户端RDA 11.0。
与新安装的SQL Server 2016一起安装。闻起来像是数据问题,更确切地说是日期列中的无效数据。也许您可以运行一个查询来搜索任何无效的日期值。@在datetime2和DateTime之间存在无效的元数据映射-具体来说,默认精度在Access中是无法实现的,并且在将列合并到键中时没有指示警告。生成的更新sql很奇怪,将所有列都放在WHERE子句中。打开链接表的表设计时,Access是否识别主键?@Andre是,正确检测到主键。更新看起来像是尝试验证更新正确性的回退。