2016-08-02 92 views
0

我有一个存储过程,在表中插入一行。该表具有自动递增的int主键和名为CreationDatedatetime2列。我通过C#代码在for循环中调用它,并且循环在事务范围内。奇怪的行插入顺序

我运行程序两次,第一次用for循环转了6次,第二次用for循环转了2次。当我执行该选择SQL Server上我有一个奇怪的结果

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

enter image description here

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

+1

“但事实并非如此”我没有看到你的陈述是真实的。随着时间的推移,这些数字正在上升。数字上升但没有单一数字,但时间少于以前的数字。 – nvoigt

+0

为什么在58002之后会插入58001? –

+0

这是正确的,主键值是正确的,查看你的查询,你按照创建日期DESCENDING命令结果,所以期望第二个循环的值会先执行,因为它们是在第一个循环执行后插入的。 – Sherlock

回答

2

这是速度报表范围还有一个问题...

试试这个:

- 这将创建一个@numbers表,其中包含1个mio号码:

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); 

--Play与@Count值周围。您可以一次插入1 mio行。虽然这个运行了一段时间,都将具有相同的日期时间值:

--USE少数这里及以下,还是价值的同时

--USE这里一个很大的数量及以下小将呈现略晚值的第二个插入

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

--a第二插入

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

SELECT * FROM Dummy; 

--clean达

GO 
DROP TABLE Dummy; 
2

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

得到你需要通过RequestId以及排序所需的顺序:

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