线插入的奇怪顺序

时间:2016-08-02 13:35:56

标签: c# sql-server

我有一个在表中插入一行的存储过程。此表具有自动递增的int主键和名为datetime2的{​​{1}}列。我通过我的C#代码在for循环中调用它,并且循环在事务范围内。

我运行程序两次,第一次使用for循环翻转6次,第二次使用for循环翻转2次。当我在sql server上执行此选择时,我得到了一个奇怪的结果

CreationDate

enter image description here

我没有得到的是插入顺序:例如,ID = 58002之后必须插入Id = 58001的行,但事实并非如此。那是因为我把我的循环放在一个事务scoope中吗?或者datetime2的精度是不够的?

2 个答案:

答案 0 :(得分:2)

您插入的速度非常快,因此在一个程序运行中插入的实际CreationDate值具有相同的值。如果您使用datetime类型,则所有插入都可能在一毫秒内完成。因此ORDER BY CreationDate DESC本身并不保证选择顺序是插入顺序。

要获得所需的订单,您还需要按RequestId排序:

SELECT TOP 8 RequestId, CreationDate 
FROM PickupRequest
ORDER BY CreationDate DESC, RequestId DESC

答案 1 :(得分:2)

这是速度声明范围的问题......

试试这个:

- 这将创建一个包含1个mio编号的@numbers表:

DECLARE  @numbers TABLE(Nbr BIGINT);
WITH N(N) AS
(SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1)
,MoreN(N) AS
(SELECT 1 FROM N AS N1 CROSS JOIN N AS N2 CROSS JOIN N AS N3 CROSS JOIN N AS N4 CROSS JOIN N AS N5 CROSS JOIN N AS N6)
INSERT INTO @numbers(Nbr) 
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM MoreN;

- 这是一个用于插入的虚拟表:

CREATE TABLE Dummy(ID INT IDENTITY,CreationDate DATETIME);

- 使用@Count的值。您可以一次插入1 mio行。虽然这会运行一段时间,但所有日期时间值都相同:

- 在此处使用较小的数字,仍然是相同的时间值

- 在这里使用大数,下面的小数字将显示第二个插入的稍后的值

DECLARE @Count INT = 1000;
INSERT INTO Dummy (CreationDate)
SELECT GETDATE()
FROM (SELECT TOP(@Count) 1 FROM @numbers) AS X(Y);

- 第二次插入

SET @Count = 10;
INSERT INTO Dummy (CreationDate)
SELECT GETDATE()
FROM (SELECT TOP(@Count) 1 FROM @numbers) AS X(Y);

SELECT * FROM Dummy;

- 清理

GO
DROP TABLE Dummy;