2016-04-12 15 views
1

"RENTED"と "HISTORY"という2つのテーブルがあります。アイテムが返されたら、プロシージャを使用して「ヒストリ」テーブルに移動する必要があります。テーブルはすべての点で同じです。主キーは単なる数字ですが、自動インクリメントされません。賃貸から履歴に行を移動しようとすると、プライマリキーのID番号が2であるため、競合が発生します。私はちょうどヒストリテーブルの主キーの最大値を見つける必要があることを知って、その後、行を追加します。簡単だと思ってしまい、やりにくくなった。最後に、RENTEDテーブルから行を削除します。これは実行できます。行の動きを助けてください。ありがとう!SQLは、自動インクリメントなしで同じテーブルに行を移動します(SQL Server 2008)

また、私はここにいくつかの他の同様のコードサンプル/回答を見て、しかしかなりまだ解決策を見つけることができませんでした。

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を入力し、借りたテーブルで2番目のレコードを取得し、履歴テーブルの使用可能な次の行に上に移動します。そのため、プライマリキーHISTORYテーブルのHISTORY_NUM列に挿入し、RENTEDテーブルのRENTED_OUT_ID列の反復値を取ることができないながら

**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 
+0

あなたが履歴テーブルにHISTORY_NUM列を維持している場合には、主キー –

+0

として、主キーとして機能し、主キー属性を削除します履歴テーブルに新しい自動インクリメント列を作成できません:構文は次のだろうHISTORY_NUM列から –

+0

@ mudassirhasanそれは正しいとは言えません。私がしなければならないのは、MAX(HISTORY_NUM)を見つけて1ずつ増やしてから、その行にデータを置くだけです。 – FoxDonut

答えて

1

OUTPUT INTO句を使用すると、削除したレコードを履歴テーブルに一度に挿入できます。

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 
+0

うわー、これは素晴らしいです。私はこれをテストし、明日いつかあなたの答えを受け入れるでしょう。ありがとうございました! – FoxDonut

1

問題が発生しているテーブルのより良好な視覚化(省略少数列)については以下を参照。 したがって、レコードを移動する際にmaxの既存の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 
+0

これは私がやったことです。私はこれにあなたの時間を非常に感謝します!しかし、私は少ないコードが常に優れているので、私は以下の答えを受け入れるだろう。もう一度、ムダシールに感謝します。 – FoxDonut

関連する問題