在 SQL Server 2005 中使用 ROW_NUMBER() 而不使用 ORDER BY 进行自动递增
在 SQL 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中文网其他相关文章!