WENN NICHT NULL, dann behält UPDATE den Wert des Feldes bei

10

Ich denke, ich bin irgendwie nah dran, es zum Laufen zu bringen, aber aus irgendeinem Grund bekomme ich immer noch Fehler.

Ich habe die folgende UPDATE-Abfrage:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' THEN @Accessories
          WHEN 'Description' THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

Die Parameter werden von verschiedenen Benutzern ausgefüllt. Das Problem, mit dem ich jetzt konfrontiert bin, ist, dass Sie selbst dann, wenn Sie ein einzelnes Feld aktualisieren möchten, die anderen Parameter mit den alten Daten ausfüllen müssen. Daher möchte ich die Option IF @parameter IS NULL setzen, DANN den Wert behalten, der bereits in der DB gespeichert ist. Ich habe versucht, eine Lösung zu finden, und so etwas wie die folgende Abfrage scheint die Lösung zu sein, aber ich kann sie nicht zum Laufen bringen:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories' IS NOT NULL THEN @Accessories
          WHEN 'Description' IS NOT NULL THEN @Description
          WHEN 'Specification' IS NOT NULL THEN @Specification
          ELSE Details
END
WHERE DeviceID = 10

Die Datenbank wird in SQL Server 2008 gespeichert

Vielen Dank im Voraus für die Hilfe.

EDIT zur Verdeutlichung:

Der ursprüngliche Tisch sieht so aus

DeviceID|Name         |Details   |
     10 |Accessories  |earplugs  |
     10 |Description  |protectors|
     10 |Specification|BeatsByDre|

Aus Veröffentlichungsgründen habe ich eine Abfrage gestellt, um den Spieß umzudrehen. Wenn die Select-Abfrage ausgeführt wird, sieht die Rückgabetabelle wie folgt aus

DeviceID|Accessories|Description|Specification|
     10 |earplugs   |protectors |BeatsByDre   |

Ich habe eine Benutzeroberfläche erstellt, mit der Systembenutzer die verschiedenen Felder wie Zubehör, Beschreibung, Spezifikation aktualisieren können. Das Update funktioniert, wenn ich alle Felder mit der oben angezeigten Abfrage aktualisiere. Wenn ich jedoch ein Textfeld leer lasse, wird die Fehlermeldung angezeigt, dass dem @ -Parameter ein Wert fehlt. Versuchen Sie also, eine Lösung zu finden, um nur das Feld zu aktualisieren, in dem etwas geschrieben ist. Wenn also @parameter NULL ist, behalten Sie den ursprünglichen Wert in der Datenbank bei. Ich habe eine andere Lösung gefunden, die meinem Wunsch sehr nahe kommt, sie aber nicht zum Laufen bringt. Hier ist die andere Lösung: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0

Grünschnabel
quelle
Können Sie genau diesen Fehler angeben? Handelt es sich um einen SQL Server-Fehler oder um einen Fehler in Ihrer (UI-) Anwendung? Welche UPDATEAnweisung sendet die Benutzeroberfläche an die Datenbank?
Ypercubeᵀᴹ
Können Sie das in die Frage aufnehmen? Es kann daran liegen, wie die Anweisung aufgebaut ist und welche Anführungszeichen verwendet werden. Das '@'Accessoriesergibt für mich keinen Sinn.
Ypercubeᵀᴹ
1
Ich denke, dass Ihr UI-Code möglicherweise keine gültigen Anweisungen erzeugt. Zeigen Sie uns den Code, den Sie haben, und erzeugen Sie den Fehler, nicht den Pseudocode.
Ypercubeᵀᴹ
Ich möchte mich nochmals bei Ihnen für die Hilfe bedanken. Entschuldigung für meine mangelnde Erfahrung. Ich habe den Fehler gefunden und Sie hatten Recht, das Problem lag auf der Benutzeroberfläche. Vielen Dank für die Hilfe. Für den Fall, dass jemand nach einer ähnlichen Antwort sucht, habe ich die erste Lösung verwendet
Greenhorn

Antworten:

13

Ich denke, das wird das Problem lösen:

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN COALESCE(@Accessories, Details)
          WHEN 'Description'   THEN COALESCE(@Description, Details)
          WHEN 'Specification' THEN COALESCE(@Specification, Details)
          ELSE Details
              END
WHERE DeviceID = 10 ;

oder dies (um redundante Updates zu vermeiden):

UPDATE DeviceAttribute
SET Details = CASE Name
          WHEN 'Accessories'   THEN @Accessories
          WHEN 'Description'   THEN @Description
          WHEN 'Specification' THEN @Specification
          ELSE Details
              END
WHERE DeviceID = 10 
  AND ( Name = 'Accessories'   AND @Accessories IS NOT NULL
     OR Name = 'Description'   AND @Description IS NOT NULL
     OR Name = 'Specification' AND @Specification IS NOT NULL
      ) ;

oder dies unter Verwendung eines Tabellenwertkonstruktors:

UPDATE da
SET da.Details = upd.Details
FROM DeviceAttribute AS da
  JOIN
    ( VALUES
      ('Accessories'   , @Accessories),
      ('Description'   , @Description),
      ('Specification' , @Specification)
    ) AS upd (Name, Details)
    ON upd.Name = da.Name 
WHERE da.DeviceID = 10
  AND upd.Details IS NOT NULL ;
ypercubeᵀᴹ
quelle
Danke für die schnelle Antwort. Ich werde es ausprobieren und Sie über das Ergebnis informieren.
Greenhorn
Du meinst die 2. Lösung in meiner Antwort?
Ypercubeᵀᴹ
Ja, ich versuche die 3. Lösung. Ich habe die Antworten positiv bewertet, weil sie viele Möglichkeiten bieten. Ich bin der 3. und wenn ich es zum Laufen bringe, werde ich es auch akzeptieren.
Greenhorn
Alles sollte funktionieren. Wenn dies nicht der Fall ist, können Sie Ihre Frage bearbeiten und die Tabellenstruktur (Create Table-Anweisung) und die gespeicherte Prozedur hinzufügen. Möglicherweise gibt es etwas Relevantes, das ich falsch verstehe oder das Sie nicht erwähnt haben.
Ypercubeᵀᴹ
Wenn diese Antworten funktionieren, wenn alle Parameter nicht null sind, aber nicht, wenn einer von ihnen null ist, sehen Sie sich den UI-Code an und wie er beim Erstellen der Abfrage mit null umgeht. Und Sie können diesen (UI-) Code bei der Frage hinzufügen.
Ypercubeᵀᴹ