2016-04-12 1 views
1

У меня есть две таблицы - «СДАНО» и «ИСТОРИЯ». После возврата элемента мне нужно переместить его в таблицу «ИСТОРИЯ», используя процедуру. Таблицы одинаковы во всех отношениях. Первичный ключ - это просто число, но НЕ автоинкремент. Когда я пытаюсь переместить строку из Rented to History, я получаю столкновение, потому что первичные ключи имеют номер 2 для идентификационного номера. Я знаю, что мне просто нужно найти максимальное значение первичного ключа в таблице HISTORY, а затем добавить строку после. Казалось, что это сложно сделать. Наконец, я удаляю строку из таблицы RENTED, которую я могу сделать. Пожалуйста, помогите мне с движением ряда. Благодаря!SQL Moving Row to Identical Table БЕЗ автоинкремента (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 записи в таблице Сдан и перейти к следующей строке таблицы истории. Ниже для лучшей визуализации таблиц (несколько столбцов опущенных)

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

создать новый автоматический инкрементируются столбец в таблице истории, которая будет выступать в качестве первичного ключа и удалить атрибут первичного ключа from HISTORY_NUM column –

+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

проблема возникает при вставке в HISTORY_NUM колонки HISTORY таблицы, поскольку его первичный ключа и не может принимать повторяющиеся значения из RENTED_OUT_ID столбца RENTED таблицы. Итак, найдите максимальное существующее значение HISTORY_NUM и увеличивайте его на единицу, чтобы вставлять новую запись каждый раз при перемещении записей.

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