SQL Сравнить поле, которое обновляется - PullRequest
2 голосов
/ 21 октября 2011

У меня следующий запрос:

UPDATE #Temp_SessionItem SET [Status] = 
    CASE
        WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL) AND [Status] = 1
            THEN 3
        WHEN [AddressFK] IS NOT NULL AND [StatusFK] IS NOT NULL AND [Status] = 1
            THEN 2
    END

Проблема в том, что когда он выполняется, он на самом деле не дает ожидаемого результата. то есть он не устанавливает значение поля [Status] на 3 в случае, если [AddressFK] или [StatusFK] равно NULL. Вместо этого он просто пытается добавить NULL в Status, когда должен добавить 3.

Если я удаляю часть выражения AND [Status] = 1, она возвращает 3, но затем обновляет также значения, не являющиеся [Status] = 1.

Есть что-нибудь очевидное, что я здесь скучаю?

Я использую SQL Server 2008.

EDIT:

После того, как Рой Намир указал мне, я понял, что проблема должна заключаться в хранимой процедуре, в которой выполняется этот запрос. В частности, #Temp_SessionItem - это просто временная таблица. После указанного выше запроса я пытаюсь обновить исходную таблицу следующим запросом:

--  update the status of the original session item table
    UPDATE UploadSessionItem SET [Status] = T.[Status]
    FROM #Temp_SessionItem AS T
    WHERE UploadSessionItem.UploadSessionItemId  = T.ID

.. что, очевидно, не работает, так как все [Status] элементы все еще 1

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Если вы хотите воздействовать только на строки с текущим STATUS, равным 1, вам нужно предложение WHERE:

UPDATE #Temp_SessionItem SET [Status] = 
    CASE
        WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL)
            THEN 3
        WHEN [AddressFK] IS NOT NULL AND [StatusFK] IS NOT NULL
            THEN 2
    END
WHERE [Status] = 1

Показанное вами обновление работает нормально:

create table UploadSessionItem(UploadSessionItemID int,Status int)
insert into UploadSessionItem
select 1,1 union all select 2,2
create table #Temp_SessionItem (ID int,Status int)
insert into #Temp_SessionItem select 1,4
--Your UPDATE:
UPDATE UploadSessionItem SET [Status] = T.[Status]
    FROM #Temp_SessionItem AS T
    WHERE UploadSessionItem.UploadSessionItemId  = T.ID
--
select * from UploadSessionItem

Результат:

UploadSessionItemID Status
1                   4
2                   2

Так что, если проблема заключается в в другом месте, это не относится к примеру кода, который вы нам показали.

2 голосов
/ 21 октября 2011

@ bojanskr, либо [AddressFK] & [StatusFK] не равны нулю, либо ваш статус! = 1

каково значение статуса перед обновлением? какой он тип?

paste результат этого запроса здесь:

  select case when [AddressFK] IS NULL then 'AddressFKnull' else 'AddressFKNOTnull' end,
    case when [StatusFK] IS NULL then 'StatusFKnull' else 'StatusFKNOTnull' end , Status
    from  #Temp_SessionItem
1 голос
/ 21 октября 2011

У вас нет регистра по умолчанию, поэтому вы получаете NULL, если ни одно из этих условий не выполняется.Вы можете переписать это так:

UPDATE #Temp_SessionItem SET [Status] = 
  CASE
    WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL)
        THEN 3
    ELSE 2
  END
WHERE [Status] = 1
...