插入记录的顺序不匹配

use*_*247 4 sql-server insert

请检查下面的表结构和要插入该表的记录。

CREATE TABLE [tabGeneraltable](
   id int identity,
   [codGenLedger] [uniqueidentifier] NOT NULL,
   [codInvoice] [numeric](18, 0) NULL,
   [accountValue] [numeric](18, 2) NULL,
   [articleValue] [nvarchar](50) NULL,
   [codFinAccount] [int] NULL,
   [documentNbr] [nvarchar](50) NULL,
   [valueDate] [datetime] NULL,
   [insertDate] [datetime] NULL,
   CONSTRAINT [PK_tabGeneralLedger] PRIMARY KEY CLUSTERED([codGenLedger] ASC)
)


insert into [tabGeneraltable]([codGenLedger],[codInvoice], [codFinAccount],
                              [accountValue],[insertDate])
select NEWID(),1,11,232,getdate()
union all
select NEWID(),10,45,214,getdate()
union all
select NEWID(),9,425,410,getdate()
union all
select NEWID(),14,475,356,getdate()
Run Code Online (Sandbox Code Playgroud)

插入所有记录后,当在这个表上执行一个简单的选择语句时

select * from tabGeneraltable
Run Code Online (Sandbox Code Playgroud)

标识列 ID 的顺序不正确或记录是随机插入的。(insertDate如果单独插入所有记录,请检查列值。)

为什么会发生这种情况?

Tom*_*m V 12

如果您没有指定 order by 子句,您的 RDBMS 可以自由地返回它选择的结果。通常它会按照它可以最快检索记录的顺序返回结果。

由于您将列codGenLedger作为聚集键,因此记录将按codGenLedger物理顺序存储在磁盘上(除非您的索引是碎片化的,但它们仍按该顺序读取)。

您的 RDBMS 很可能会在您的示例中执行聚集索引扫描,并返回按聚集索引排序的结果。

有关sql server 示例,请参阅此 sqlfiddle

这实际上是按您的 uniqueidentifier 排序的,当您按字母顺序查看它时,它看起来不像,而是按二进制数据的十六进制表示排序。

有关完整说明,请参见此处

事实上,数据是经过排序的;它只是没有按照您期望的方式排序。SQL Server 将全局唯一标识符 (GUID) 数据显示为一系列字母数字字符串,但 uniqueidentifier 数据类型等效于 binary(16) 数据类型。您看到的 GUID 值只是二进制值的十六进制表示。因此数据按此十六进制表示排序,而不是按字母顺序排序。