2016-04-12 3 views
1

Ich habe zwei Tabellen - "RENTED" und "HISTORY." Sobald ein Artikel zurückgegeben wurde, muss er mithilfe einer Prozedur in die Tabelle "HISTORY" verschoben werden. Die Tabellen sind in jeder Hinsicht identisch. Der Primärschlüssel ist nur eine Zahl, wird aber NICHT automatisch inkrementiert. Wenn ich versuche, eine Zeile von "Vermietet" in "Verlauf" zu verschieben, erhalte ich einen Konflikt, weil die Primärschlüssel beide die Nummer 2 für eine ID-Nummer haben. Ich weiß, ich muss nur den Maximalwert des Primärschlüssels in der Tabelle HISTORY finden und dann die Zeile danach hinzufügen. Es schien einfach, es war schwierig zu tun. Zuletzt lösche ich die Zeile aus der VERMIETET Tabelle, die ich tun kann. Bitte helfen Sie mir bei der Zeilenbewegung. Vielen Dank!SQL Moving Row in identische Tabelle OHNE Auto-Inkrement (SQL Server 2008)

Auch hier habe ich mir ein paar andere ähnliche Codebeispiele/Antworten angeschaut, aber noch keine Lösung gefunden.

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 

So in diesem Verfahren, ich möchte nur die Nummer 2 und nehmen Sie die 2. Datensatz in der VERMIETET Tabelle eingeben und nächste verfügbare Zeile in der Geschichte Tisch rücken. Siehe unten für eine bessere Visualisierung der Tabellen (a weggelassen wenig Spalten)

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

Es ist nicht möglich, wenn Sie HISTORY_NUM Spalte in HISTORY Tabelle sind die Aufrechterhaltung als Primärschlüssel –

+0

ein neues Auto erhöht Spalte in HISTORY Tabelle erstellen, die als Primärschlüssel wirken und den Primärschlüssel Attribut entfernen aus HISTORY_NUM Spalte –

+0

@ Mudassirhasan Das kann nicht stimmen. Alles, was ich tun müsste, ist, den MAX (HISTORY_NUM) zu finden und ihn um 1 zu erhöhen, und dann die Daten in diese Zeile zu legen? – FoxDonut

Antwort

1

Sie können die OUTPUT INTO-Klausel verwenden, um den gelöschten Datensatz in einem Schritt in die Verlaufstabelle einzufügen. Die Syntax wird dies:

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

Wow, das ist großartig. Ich teste das und akzeptiere deine Antwort irgendwann morgen, wenn es so einfach funktioniert. Vielen Dank! – FoxDonut

1

Das Problem auftritt, während in HISTORY_NUM Spalt HISTORY Tabelle, da es einen Primärschlüssel eingefügt und nicht wiederholenden Wert von RENTED_OUT_ID Spalte RENTED Tisch nehmen. So finden Sie max vorhandenen HISTORY_NUM Spaltenwert und erhöhen Sie um eins, um jedes Mal neue Datensatz einzufügen, während Datensätze verschoben werden.

+0

Dies ist, was ich getan habe, außer nicht ganz so reibungslos. Ich schätze deine Zeit sehr! Allerdings ist mir weniger Code immer besser, also werde ich die Antwort unten akzeptieren. Nochmals vielen Dank, Mudassir. – FoxDonut