是否可以从 Access 更新 SQL Server 2016 临时表?
Is is possible to update SQL Server 2016 temporal tables from Access?
我已经创建了一个 SQL Server 2016 数据库,其时间 table Product
。我想通过链接 table 从 Access 数据库更新 table。尝试执行此操作时,Access 报告
Reserved error (-7776): there is no error message for this error
table定义为:
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 table 中。更新已正确反映在历史记录中 table。
我曾尝试隐藏有效时间列以防后端更改导致问题,但没有效果。 Product
和 Product status
table 都包含最少的数据。
是否有一些特定的方法可以让它工作,或者不支持这种情况?
datetime2(7)
列中的默认精度超过了 Access 中可用的精度。当精度降低到 datetime2(3)
时,查询变得可更新。
即使这可能太高了,因为小数秒可能只有 2 位多一点。链接 table 时,没有消息报告表明有效表示不足以表示该列。
来自 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 服务器类型的全面映射会很有帮助。
已部分省略 GUID 以使输出更具可读性。
我已经创建了一个 SQL Server 2016 数据库,其时间 table Product
。我想通过链接 table 从 Access 数据库更新 table。尝试执行此操作时,Access 报告
Reserved error (-7776): there is no error message for this error
table定义为:
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 table 中。更新已正确反映在历史记录中 table。
我曾尝试隐藏有效时间列以防后端更改导致问题,但没有效果。 Product
和 Product status
table 都包含最少的数据。
是否有一些特定的方法可以让它工作,或者不支持这种情况?
datetime2(7)
列中的默认精度超过了 Access 中可用的精度。当精度降低到 datetime2(3)
时,查询变得可更新。
即使这可能太高了,因为小数秒可能只有 2 位多一点。链接 table 时,没有消息报告表明有效表示不足以表示该列。
来自 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 服务器类型的全面映射会很有帮助。
已部分省略 GUID 以使输出更具可读性。