Sql-Server

插入記錄的順序不匹配

  • March 13, 2022

請檢查下面的表結構和要插入該表的記錄。

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

插入所有記錄後,在此表上執行簡單的選擇語句時,例如

select * from tabGeneraltable

標識列 ID 的順序不正確或記錄是隨機插入的。(insertDate如果單獨插入所有記錄,請檢查列值。)

為什麼會這樣?

**如果您沒有指定 order by 子句,您的 RDBMS 可以自由地返回它選擇的結果。**通常它會按照它可以最快檢索記錄的順序返回結果。

由於您將列codGenLedger作為聚集鍵,因此記錄將按codGenLedger物理順序儲存在磁碟上(除非您的索引是碎片化的,但它們仍按該順序讀取)。

您的 RDBMS 很可能會在您的範例中執行聚集索引掃描,並返回按聚集索引排序的結果。

有關 sql server 範例,請參閱此 sqlfiddle

這實際上是按您的唯一標識符排序的,當您按字母順序查看它時,它看起來並不像它,而是按二進制數據的十六進製表示排序。

有關完整說明,請參見此處

事實上,數據是排序的;它只是沒有按照您期望的方式排序。SQL Server 將全域唯一標識符 (GUID) 數據顯示為一系列字母數字字元串,但 uniqueidentifier 數據類型等效於 binary(16) 數據類型。您看到的 GUID 值只是二進制值的十六進製表示。所以數據是按這個十六進製表示排序的,而不是按字母順序。

引用自:https://dba.stackexchange.com/questions/105118