SQL 将行移动到相同 Table 不自动递增(SQL Server 2008)

SQL Moving Row to Identical Table WITHOUT auto-increment (SQL Server 2008)

我有两个 tables - "RENTED" 和 "HISTORY." 一旦物品被退回,我需要将它移动到 "HISTORY" table 使用程序。 table 在各个方面都是相同的。主键只是一个数字,但不会自动递增。当我尝试将一行从 Rented 移动到 History 时,我遇到了冲突,因为主键的 ID 号都是 2。我知道我只需要在 HISTORY table 中找到主键的最大值,然后在后面添加行。看似容易,做起来却很难。最后,我删除了 RENTED Table 中的行,我可以这样做。请协助我划船。谢谢!

另外,我在这里查看了一些其他类似的代码 samples/answers,但还没有找到解决方案。

Create Procedure spMoveToHistory
@RENTED_OUT_NUM bigint

AS

Begin

  Insert Into HISTORY
  Select *
  From RENTED_OUT
  Where RENTED_OUT_NUM = @RENTED_OUT_NUM
    Select @RENTED_OUT_NUM = (MAX(HISTORY_NUM)+1)
    From HISTORY

Delete From RENTED
Where RENTED_OUT_NUM = @RENTED_OUT_NUM


End

所以在此过程中,我只想输入数字 2 并获取 RENTED table 中的第二条记录,然后移至 HISTORY table 的下一个可用行。请参阅下文以更好地可视化 tables(省略几列)

**RENTED TABLE:** 
RENTED_OUT_ID (PK) | ITEM_NAME | ITEM_DESC | DATE_RENTED | DATE_RETURNED
1                      data         data       data           data
2   move this          data         data       data           data         
3                      data         data       data           data         


**HISTORY TABLE:**
HISTORY_NUM   (PK) | ITEM_NAME | ITEM_DESC | DATE_RENTED | DATE_RETURNED
1                      data         data       data           data         
2                      data         data       data           data            
->   INSERT HERE

HISTORY table 的 HISTORY_NUM 列中插入时出现问题,因为它是一个主键,无法获取 [=14] 的 RENTED_OUT_ID 列的重复值=] table。 因此,每次移动记录时,找到最大现有 HISTORY_NUM 列值并递增 1 以插入新记录。

Create Procedure spMoveToHistory
@RENTED_OUT_NUM bigint

AS

Begin


DECLARE @HISTORY_ID BIGINT
SELECT @HISTORY_ID = MAX(HISTORY_NUM) FROM HISTORY

Insert Into HISTORY(HISTORY_NUM, ITEM_NAME, ITEM_DESC, DATE_RENTED,  DATE_RETURNED)
Select @HISTORY_ID + 1 , ITEM_NAME, ITEM_DESC, DATE_RENTED,  DATE_RETURNED
From RENTED_OUT
Where RENTED_OUT_ID = @RENTED_OUT_NUM



Delete From RENTED
Where RENTED_OUT_NUM = @RENTED_OUT_NUM


End

您可以使用 OUTPUT INTO 子句将删除的记录一次性插入到历史记录中 table。语法是这样的:

declare @max_id bigint
select @max_id = max(HISTORY_NUM)+1 from history

DELETE FROM rented 
OUTPUT @max_id
     , DELETED.ITEM_NAME
     , DELETED.ITEM_DESC
     , DELETED.DATE_RENTED
     , DELETED.DATE_RETURNED
INTO history
WHERE RENTED_OUT_NUM = @RENTED_OUT_NUM