在SQL Server 2005 中使用ROW_NUMBER() 而不使用ORDER BY 進行自動遞增
在 Server 2005 中,自動遞增當使用ROW_NUMBER()且缺少標識列時,標識列可能會具有挑戰性合適的 ORDER BY 標準。但是,還有其他選擇:
將 ROW_NUMBER() 與常數 Order By 子句結合使用:
雖然缺少有效的 ORDER BY 字段,但 ROW_NUMBER()可以與模擬自動遞增的常數排序子句:
INSERT dbo.TargetTable (ID, FIELD) SELECT Row_Number() OVER (ORDER BY (SELECT 1)) + Coalesce( (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)), 0 ), FieldValue FROM dbo.SourceTable WHERE {somecondition};
This方法避免明確排序,同時確保 ID 列中的唯一性。
警告:不保證原始排序:
要注意的是,這種方法不能保證保存原始的SourceTable順序。其他因素,例如外部查詢的 ORDER BY,可能會影響結果排序。
並發注意事項:
鎖定提示(TABLOCKX 和 HOLDLOCK)包含在查詢以防止並發程序在查詢執行步驟之間插入相同的 ID。但是,這種方法不如使用識別列有效,只能被視為一種解決方法。
推薦解決方案:使用識別列:
為了獲得最佳效能和併發性方面,強烈建議使用identity列進行自增。
以上是如何在 SQL Server 2005 中使用 ROW_NUMBER() 自動遞增非識別列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!