2016-08-02 90 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