Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
SQL Server 2012中某些表的默认GETDATE约束_Sql_Sql Server_Constraints_Getdate - Fatal编程技术网

SQL Server 2012中某些表的默认GETDATE约束

SQL Server 2012中某些表的默认GETDATE约束,sql,sql-server,constraints,getdate,Sql,Sql Server,Constraints,Getdate,正如您所预料的,在SQLServer2012中的一些表上,默认约束中的GETDATE有问题 我有如下两张表(A和B): 我有一个过程,在这个过程中,我要做两个插入——第一个插入到表A,第二个插入到B,没有列CREATE_DATETIME。他们之间有很多东西 现在猜猜表A和B中CREATE_DATETIME列中是什么 对于来自同一sp执行(已验证)的记录,表A中的datetime比表B中的datetime大两次(可能在1000000条记录之后,以前从未有过),如下所示: 你能给我一些线索吗 评论回

正如您所预料的,在SQLServer2012中的一些表上,默认约束中的GETDATE有问题

我有如下两张表(A和B):

我有一个过程,在这个过程中,我要做两个插入——第一个插入到表A,第二个插入到B,没有列CREATE_DATETIME。他们之间有很多东西

现在猜猜表A和B中CREATE_DATETIME列中是什么

对于来自同一sp执行(已验证)的记录,表A中的datetime比表B中的datetime大两次(可能在1000000条记录之后,以前从未有过),如下所示:

你能给我一些线索吗

评论回复:
1.没有触发器。
2.一次没有1000000条记录,它是表中第一次出现错误时的记录总数。此信息用于统计分析-今天的错误发生在上次错误之后的xx数千条记录之后-因此它是非常随机的。
3.是的,语句按此顺序100%执行。
4.无事务或单个-两个不同的进程-相同错误。
5.当然可以


重要!有人告诉我GETDATE的精度为3毫秒,因此可能GETDATE使用循环法对毫秒进行循环,以便在相同或几乎相同的时间内(差<3ms)进行两次循环,它可以给出两种不同的近似值?

如果在表A中插入并提交第一次插入,然后在表B中插入并提交第二次插入,很有可能得到这个结果,因为需要时间差来插入两条记录。即使您没有在单独的事务中提交插入

当表增长时,由于许多原因,插入将花费越来越多的时间。如果表在每次插入时都有索引,则索引必须注意记录保存或组织的位置。其次,sql server内部页面中的碎片会使插入花费更多时间。如果想要更快的插入,请检查索引结构,并保持较低的填充因子

如果希望始终使用相同的时间,请创建一个变量获取时间,然后使用此变量在两个表中进行插入

希望有帮助。

源于操作系统的时钟-如果有什么事情导致服务器上的时钟发生变化(提前),您将实现(明显的)时间旅行


是什么导致了这样的变化?最明显的是手动调整,或者如果服务器设置为自动将其时钟与外部源(例如域中的另一台机器或通过NTP)同步。可能还有其他原因。

约束中的GETDATE到SYSDATETIME更改似乎可以解决问题。

我想您可以在两个表上创建一个后插入触发器,使用一列中的时间更新另一个表中的datetime列。您一次插入的行数超过一百万行吗?您是否考虑过使用定义并填充一次的变量来覆盖默认值,而不是依赖默认值?您是否有作业的执行计划;您知道SQL在插入TableB之前实际执行插入TableA吗?:这似乎是给定代码的逻辑顺序,但是SQL是否以相同的方式编译代码?插入是在单个事务中还是在多个事务中?表A或表B是否具有数据类型datetime的日期列而不是datetime2,也就是说,您确定它们都是datetime2
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)
);
row in A: 2013-11-07 00:02:22.7000000 
row in B: 2013-11-07 00:02:22.6970000