在 SQL Server 2005 中不使用 ORDER BY 生成自动增量 ID
自动增量时需要将数据从一个表插入到另一个表非身份列可能是一个挑战。标准方法涉及使用游标或创建表变量,但这些可能效率低下。
如果没有合法的 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};
此方法计算最大 ID 并在获取锁时插入数据以避免并发错误。
但是,请注意,强烈建议使用标识列,因为它消除了需要用于锁定并确保最佳并发性。标识列为 SQL Server 中的自动递增 ID 提供了更高效、更强大的解决方案。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3