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
我有两个 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