避免在 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中文网其他相关文章!