SE NON NULL, quindi AGGIORNA altrimenti mantenere il valore del campo


10

Penso di essere in qualche modo vicino per farlo funzionare, ma per qualche motivo ricevo ancora errori.

Ho la seguente query di AGGIORNAMENTO:

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

I parametri sono compilati da diversi utenti. Il problema che devo affrontare ora è che anche quando si desidera aggiornare un singolo campo, è necessario compilare con i vecchi dati gli altri parametri. Pertanto, desidero impostare l'opzione SE @parameter IS NULL THEN keep the value che è già memorizzato nel DB. Ho provato a trovare una soluzione e qualcosa come la seguente query sembra essere la soluzione ma non riesco a farlo funzionare:

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

IL DB è archiviato in SQL Server 2008

Grazie in anticipo per l'aiuto.

EDIT per chiarire:

La tabella originale è simile a questa

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

Per motivi di pubblicazione ho fatto una query per girare le tabelle. Pertanto, quando viene eseguita la query Seleziona, la tabella di ritorno appare come la seguente

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

Ho creato un'interfaccia utente per consentire agli utenti del sistema di aggiornare i diversi campi come Accessori, Descrizione, Specifica. L'aggiornamento funziona se aggiorno tutti i campi con la query mostrata in alto. Tuttavia, quando lascio vuota una casella di testo, viene visualizzato un messaggio di errore nel parametro @parameter. Quindi, cercando di trovare una soluzione per aggiornare solo il campo in cui è scritto qualcosa. Quindi, se @parameter IS NULL, mantenere il valore originale nel DB. Ho trovato un'altra soluzione che è molto vicina a ciò che voglio ma non riesco a farlo funzionare. Ecco l'altra soluzione: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0


Puoi fornire questo errore esatto? È un errore di SQL Server o un errore nell'applicazione (UI)? Quale UPDATEaffermazione invia l'interfaccia utente al database?
ypercubeᵀᴹ

Puoi aggiungerlo nella domanda? Può essere con come viene costruita l'istruzione e quali virgolette vengono utilizzate. Il '@'Accessoriesnon ha senso per me.
ypercubeᵀᴹ

1
Penso che il tuo codice UI potrebbe non produrre dichiarazioni valide. Mostraci il codice che hai e produce l'errore, non lo pseudo-codice.
ypercubeᵀᴹ

Voglio ringraziarti per l'aiuto. Ci scusiamo per la mia mancanza di esperienza. Sono riuscito a trovare l'errore e avevi ragione il problema era a livello di interfaccia utente. Grazie mille per l'aiuto. Nel caso qualcuno stia cercando una risposta simile, ho usato la prima soluzione
Greenhorn,

Risposte:


13

Penso che questo risolverà il problema:

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 ;

o questo (per evitare aggiornamenti ridondanti):

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

o questo, usando un costruttore di valori di tabella:

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 ;

Grazie per la risposta rapida. Lo proverò e ti farò sapere il risultato.
Greenhorn,

Intendi la seconda soluzione nella mia risposta?
ypercubeᵀᴹ

sì, sto provando la terza soluzione, ho votato a fondo le risposte perché offre molte possibilità. Sono il terzo e se lo faccio funzionare lo accetterò anche io.
Greenhorn,

Tutto dovrebbe funzionare. In caso contrario, è possibile modificare la domanda e aggiungere la struttura della tabella (istruzione Crea tabella) e la Stored procedure. Potrebbe esserci qualcosa di rilevante che fraintendo o che non hai menzionato.
ypercubeᵀᴹ

Id queste risposte funzionano quando tutti i parametri non sono nulli ma non funzionano quando uno di essi è nullo, quindi guarda il codice UI e come gestisce null quando produce la query. E potresti aggiungere quel codice (UI) alla domanda.
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.