正如您期望的那样,我在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

限制的sysdatetime变化似乎可以解决问题。

其他提示

如果您在表A中插入并提交第一个插入物,然后在表B中插入并提交第二个插入物,则可以获得此结果,因为将需要花费时间来插入两个记录。即使您不在单独的交易中提交插入物。

当桌子生长时,插入物将花费越来越多的时间,原因很多。如果表中的每个插入都有索引,则索引必须注意保存或组织记录的位置。其次,SQL Server内部的页面中的片段将使插入物需要更多时间。检查您的索引结构,如果您想要更快的插入物保持填充因子低。

如果您始终需要同一时间,请创建一个变量获取时间,然后使用此变量在两个表中进行插入。

希望能帮助到你。

GETDATE() 是从操作系统的时钟得出的 - 如果某些东西导致服务器上的时钟更改(到更早的时间),则您将实现(明显的)时间旅行。

什么可能导致这样的变化?显而易见的是手动调整,或者设置了服务器自动将其时钟与外部源同步 - 例如域上的另一台计算机或通过NTP。也可能还有其他可能的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top