2012-05-12 4 views
0

Отметка на моем лбу от стены становится слишком красной, так проводками услышать ....SQL Обновление одной таблицы на основе значений в курсоре другой таблицы

У меня есть две таблицы, и нужно обновить значение один из которых основан на критериях отбора другого. Я знаю, что я могу использовать обновление с «где существует», но у меня есть много обновлений, которые нужно выполнить. Поэтому я пытаюсь использовать курсор, чтобы поместить значения из одной таблицы в vars, а затем использовать обновление в другой таблице с этими vars. Ошибок не возникает, но также нет обновлений. Когда я меняю код на оператор Select, он правильно показывает информацию, но обновление не работает. Я не уверен, основывается ли он на создании курсора, используя «для обновления», потому что обновляемая таблица НЕ является той же, на которую курсор выбирает записи. Ниже мой запрос. Кто-нибудь, пожалуйста, сообщите мне, что я могу делать неправильно. Благодаря!

DECLARE @so VARCHAR(50) 
DECLARE @line VARCHAR(50) 
DECLARE @pdate DATETIME 
DECLARE @reason1 VARCHAR(50) 
DECLARE @reason2 VARCHAR(50) 
DECLARE @area VARCHAR(50) 

DECLARE mycursor CURSOR FOR 
SELECT [bp_so_number],[bp_line],[bp_production_date],[bp_reason1],[bp_reason2],[bp_area] 
FROM [Workflow].[dbo].[v_OTD_PostSrc] 

OPEN mycursor 
FETCH NEXT FROM mycursor 
INTO @so, @line, @pdate, @reason1, @reason2, @area 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    FETCH NEXT FROM mycursor 
    INTO @so, @line, @pdate, @reason1, @reason2, @area; 
    UPDATE otd_data SET [email protected], [email protected], [email protected] 
    WHERE [Order Number][email protected] AND [email protected] AND [Schedule Date][email protected] AND [Qty Open]>0 
    --SELECT * FROM otd_data WHERE [Order Number][email protected] AND [email protected] AND [Schedule Date][email protected] 
END 

CLOSE mycursor 
DEALLOCATE mycursor 

Как я уже говорил. Без ошибок, но и не обновляется таблица ... :-(

ответ

1

Вы делаете два получений фидов до первого обновления Попробуйте перестроить свой цикл, как:.

DECLARE @so VARCHAR(50) 
DECLARE @line VARCHAR(50) 
DECLARE @pdate DATETIME 
DECLARE @reason1 VARCHAR(50) 
DECLARE @reason2 VARCHAR(50) 
DECLARE @area VARCHAR(50) 

DECLARE mycursor CURSOR LOCAL FAST_FORWARD FOR 
SELECT [bp_so_number],[bp_line],[bp_production_date],[bp_reason1],[bp_reason2],[bp_area] 
FROM [Workflow].[dbo].[v_OTD_PostSrc] 

OPEN mycursor 
-- Always true 
WHILE 1 = 1 
BEGIN 
    -- Get next record from cursor 
    FETCH NEXT FROM mycursor 
       INTO @so, @line, @pdate, @reason1, @reason2, @area; 
    -- If there was a record @@fetch_status will be 0; 
    -- if not, or in case of an error, break the loop 
    IF @@FETCH_STATUS <> 0 
     break 
    UPDATE otd_data SET [email protected], [email protected], [email protected] 
    WHERE [Order Number][email protected] AND [email protected] AND [Schedule Date][email protected] AND [Qty Open]>0 
    --SELECT * FROM otd_data WHERE [Order Number][email protected] AND [email protected] AND [Schedule Date][email protected] 
END 

CLOSE mycursor 
DEALLOCATE mycursor 

Я добавил LOCAL and FAST_FORWARD опций для курсора. Документация по FAST_FORWARD:

Определяет FORWARD_ONLY, READ_ONLY курсор с производительностью оптимизации позволили

+0

OK, Tha. Спасибо, спасибо! Мне также пришлось использовать DATEPART() в поле даты, потому что в @pdate он проходил как «14 мая 2012 года» – bdlcne

+0

@bdlcne Добро пожаловать :-) –