限制的sysdatetime变化似乎可以解决问题。
在SQL Server 2012中的某些表中默认约束限制
-
29-07-2022 - |
题
正如您期望的那样,我在SQL Server 2012中某些表中的默认约束中有问题。
我有两个桌子,如下(A和B):
CREATE TABLE [dbo].[TABLE_A_OR_B] (
[TABLE_A_OR_B_PK] BIGINT IDENTITY (1, 1) NOT NULL,
[CREATE_DATETIME] DATETIME2 (7) CONSTRAINT [DF_TABLE_A_OR_B_CREATE_DATETIME] DEFAULT (getdate()) NOT NULL,
[CREATE_USER] VARCHAR (100) CONSTRAINT [DF_TABLE_A_OR_B_CREATE_USER] DEFAULT (suser_sname()) NOT NULL,
...
CONSTRAINT [PK_TABLE_A_OR_B] PRIMARY KEY CLUSTERED ([TABLE_A_OR_B_PK] ASC)
);
而且我有一个过程,我正在进行两个插入 - 首先到表A,然后在没有列create_datetime的情况下为B。他们之间有很多东西。
现在猜猜表A和B中的create_datetime列是什么?
两次 - 也许是在1 000 000记录之后,从未有过 - 在表A中有一个比表B中的DateTime大于同一SP执行(已验证)的记录,例如:
row in A: 2013-11-07 00:02:22.7000000
row in B: 2013-11-07 00:02:22.6970000
你能给我一些线索为什么?
评论答案:
1.没有触发器。
2.一次没有1 000 000记录,是出现错误时刻的记录总数。此信息用于统计分析 - 今天在上次错误后xx数千个记录后发生错误 - 因此非常随机。
3.是的,语句按此顺序100%执行。
4.没有交易或单个 - 两个不同的过程 - 相同的错误。
5.确定DateTime2。
重要的!有人告诉我,GetDate的准确性至3毫秒,所以也许使用圆形rob宾方法GetDate圆圈毫秒毫秒,所以两次相同或几乎相同(差异<3ms)可以给出两个不同的近似值吗?
解决方案 3
其他提示
如果您在表A中插入并提交第一个插入物,然后在表B中插入并提交第二个插入物,则可以获得此结果,因为将需要花费时间来插入两个记录。即使您不在单独的交易中提交插入物。
当桌子生长时,插入物将花费越来越多的时间,原因很多。如果表中的每个插入都有索引,则索引必须注意保存或组织记录的位置。其次,SQL Server内部的页面中的片段将使插入物需要更多时间。检查您的索引结构,如果您想要更快的插入物保持填充因子低。
如果您始终需要同一时间,请创建一个变量获取时间,然后使用此变量在两个表中进行插入。
希望能帮助到你。
GETDATE()
是从操作系统的时钟得出的 - 如果某些东西导致服务器上的时钟更改(到更早的时间),则您将实现(明显的)时间旅行。
什么可能导致这样的变化?显而易见的是手动调整,或者设置了服务器自动将其时钟与外部源同步 - 例如域上的另一台计算机或通过NTP。也可能还有其他可能的原因。