【发布时间】:2017-04-02 00:55:30
【问题描述】:
我找不到任何东西来解释为什么当调用一个根据临时表上是否已经存在记录而进行插入或更新的 SP 时,我得到了
系统版本表上的数据修改失败 'MYDB.dbo.TemporalExample' 因为事务时间早于 受影响记录的期间开始时间。
这意味着什么?它似乎只在某些时候发生,我想知道是不是因为我运行多线程代码和 azure sql 只是不喜欢同一个表的相互连接,当它是一个临时表?我正在使用实体框架(最新版本),但我怀疑这是问题所在
我的就是这个
创建过程 mysp @ID 大整数, @a 浮点数, @b NVARCHAR(10), @c 十进制(19, 4) 作为 设置事务隔离级别读取未提交 设置无计数 开始尝试 如果存在(选择前 1 ID 从 my_Temporal_Table WITH (NOLOCK) 在哪里 id = @ID 和 a = @a 和 b = @b) 开始 更新 my_Temporal_Table 放 ID = @ID, a = @a, b = @b c = @c DateModified = GETUTCDATE() 在哪里 ID = @Id 结尾 别的 开始 插入 my_Temporal_Table (Id, a, b, c, DateModified) 价值观 (@ID、@a、@b、@c、GETUTCDATE()) 结尾 结束尝试 开始捕捉 声明 @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState 整数 选择 @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE() -- 在 CATCH 块中使用 RAISERROR 返回错误 -- 有关导致的原始错误的信息 -- 执行跳转到 CATCH 块。 RAISERROR (@ErrorMessage, -- 消息文本。 @ErrorSeverity,-- 严重性。 @ErrorState -- 状态。 ) 结束捕获更新 我的临时表创建脚本:
创建表 [临时]( [TemporalId] [bigint] IDENTITY(1,1) NOT NULL, [付款] [十进制](19, 4) NOT NULL, [DateModified] [datetime2](7) 非空, [SysStartTime] [datetime2](7) 始终生成为行开始不为空, [SysEndTime] [datetime2](7) 始终生成为 ROW END NOT NULL, 约束 [TemporalId] 主键集群([TemporalId] ASC) WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON), SYSTEM_TIME 期间([SysStartTime],[SysEndTime]) )和( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Car2].[TemporalHistory]) )有人可以解释为什么我会看到这个问题,它意味着什么,更重要的是我可以如何解决它?
谢谢
【问题讨论】:
-
你为什么要更新临时表
-
我不知道我为什么不更新它?毕竟它是一个普通的表,我没有更新历史表,它是根据 MS 文档link 仍然只是您需要更新表中的数据时使用的正常更新方法
-
哦,好的,我以为是历史表
-
你不使用分区吗?
-
我为我的临时表添加了创建脚本,我没有使用分区进行更新,因为我不想将更新限制在设定的时间段内,根据 MS 文档,我应该要么?
标签: sql-server tsql azure-sql-database sql-server-2016