我有一个在表中插入一行的存储过程。此表具有自动递增的int
主键和名为datetime2
的{{1}}列。我通过我的C#代码在for循环中调用它,并且循环在事务范围内。
我运行程序两次,第一次使用for循环翻转6次,第二次使用for循环翻转2次。当我在sql server上执行此选择时,我得到了一个奇怪的结果
CreationDate
我没有得到的是插入顺序:例如,ID = 58002之后必须插入Id = 58001的行,但事实并非如此。那是因为我把我的循环放在一个事务scoope中吗?或者datetime2的精度是不够的?
答案 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;