2 Stimmen

SQL-Vergleich eines Feldes, das gerade aktualisiert wird

Ich habe die folgende Frage:

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

Das Problem ist, dass es bei der Ausführung nicht das erwartete Ergebnis liefert, d.h. es setzt nicht den Wert von [ Status Feld auf 3 setzen, wenn [ AddressFK ] oder [ StatusFK ] ist NULL . Stattdessen wird lediglich versucht, die NULL zu Status, wenn es 3 hinzufügen sollte.

Wenn ich die AND [Status] = 1 Teil des Ausdrucks wird zwar 3 zurückgegeben, aber dann werden auch die Werte aktualisiert, die nicht [Status] = 1 .

Gibt es etwas Offensichtliches, das ich hier übersehe?

Ich verwende SQL Server 2008.

EDIT:

Nachdem Royi Namir mich darauf hingewiesen hat, habe ich erkannt, dass das Problem weiter unten in der gespeicherten Prozedur liegen muss, in der diese Abfrage ausgeführt wird. Genauer gesagt, ist #Temp_SessionItem nur eine temporäre Tabelle. Nach der oben genannten Abfrage versuche ich, die ursprüngliche Tabelle mit der folgenden Abfrage zu aktualisieren:

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

was offensichtlich nicht funktioniert, da alle [ Status Artikel gibt es noch 1

2voto

Royi Namir Punkte 137891

@bojanskr , entweder sind sowohl [AddressFK] als auch [StatusFK] ungleich Null, oder Ihr staus!=1

Welchen Wert hat der Status vor der Aktualisierung? Was für ein Typ ist er?

einfügen das Ergebnis dieser Abfrage hier:

  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

2voto

Damien_The_Unbeliever Punkte 227101

Wenn Sie nur Zeilen mit einem aktuellen STATUS de 1 benötigen Sie eine WHERE Klausel:

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

Die von Ihnen gezeigte Aktualisierung funktioniert einwandfrei:

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

Ergebnis:

UploadSessionItemID Status
1                   4
2                   2

Wenn also das Problem est An anderer Stelle haben Sie uns noch kein Codebeispiel gezeigt.

1voto

Tim Rogers Punkte 20638

Sie haben keinen Standardfall, so dass Sie NULL erhalten, wenn keine der beiden Bedingungen erfüllt ist. Sie könnten es so umschreiben:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X