如何在没有光标的情况下将行插入到具有“订单”列的表中

PBM*_*eIt 4 sql-server sql-server-2016

我有一个带有订单/位置列的 SQL Server 2016 表。此列是一个 INT,用于指示表中行的首选顺序/位置以供演示。

如何在不使用游标的情况下在位置 1 插入一行?(即新行的位置为 1,现有行 - 假设在插入之前顺序正确 - 必须“向下移动”)

order/position 列不是 NULL 并强制为 UNIQUE。我也不想使用“钝力”技术,例如将所有行的顺序/位置值设置为一些“从未使用”的值,然后只对所有行执行重新排序。

ype*_*eᵀᴹ 5

我想你想要这样的东西:

BEGIN TRANSACTION ;

    DECLARE @pos INT = 1 ;

    UPDATE tbl
    SET position = position + 1
    WHERE position >= @pos
      AND EXISTS
          (SELECT * FROM tbl WHERE position = @pos) ;

    INSERT INTO tbl
      (<column names>, position)
    VALUES
      (<values ...>, @pos) ;

COMMIT TRANSACTION ;
Run Code Online (Sandbox Code Playgroud)

请注意,如果您经常插入,则此设计将表现得非常低效。它基本上会为每个新插入更新几乎整个表!

  • 我看不到我的代码如何产生 UNIQUE 约束违规。您不需要任何 ORDER BY 即可使 UPDATE 工作。你链接的问题不同,他们想申请row_numbers。 (2认同)

归档时间:

查看次数:

1572 次

最近记录:

7 年,3 月 前