避免在SQL Server 2005 ROW_NUMBER() 中使用ORDER BY
將資料從一個表插入另一個表時,通常需要自動遞增目標表中的非識別列。雖然可以使用 ROW_NUMBER() 函數來實現此目的,但它通常需要 ORDER BY 欄位。但是,如果必須保留來源表的原始順序,則需要找到替代方法。
避免明確排序的解決方案涉及以下程式碼:
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};
此程式碼利用視窗函數根據常數值計算行號,有效地取代了對 ORDER BY 子句的需要。此外,為了防止並發問題,查詢在計算目標表中的最大值時採用鎖定提示(TABLOCKX 和 HOLDLOCK)。
需要注意的是,雖然此方法避免明確指定順序,但它並沒有t 保證源表的原始順序將被保留。外部查詢順序等因素仍會影響結果。從資料庫的角度來看,「保留原始順序」的概念並不真正存在。
為了獲得最佳並發性和資料完整性,強烈建議使用識別列而不是此解決方法。除非絕對必要,否則應避免透過鎖定提示進行獨佔表鎖定。
以上是如何在 SQL Server 2005 中自動遞增非識別列而不在 ROW_NUMBER() 中使用 ORDER BY?的詳細內容。更多資訊請關注PHP中文網其他相關文章!