SI NO ES NULO, ACTUALIZAR; de lo contrario, mantenga el valor del campo

10

Creo que de alguna manera estoy cerca para que funcione, pero por alguna razón sigo teniendo errores.

Tengo la siguiente consulta de ACTUALIZACIÓN:

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

Los parámetros son completados por diferentes usuarios. El problema al que me enfrento ahora es que, incluso cuando desea actualizar un solo campo, debe completar con los datos antiguos los otros parámetros. Por lo tanto, me gustaría establecer la opción SI @parameter IS NULL THEN LUEGO mantener el valor que ya está almacenado en la base de datos. Traté de encontrar alguna solución y algo como la siguiente consulta parece ser la solución, pero no puedo hacer que funcione:

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

THE DB se almacena en SQL Server 2008

Gracias de antemano por la ayuda.

EDITAR para aclarar:

La mesa original se ve así

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

Por razones de publicación, hice una consulta para cambiar las tablas. Entonces, cuando se ejecuta la consulta Seleccionar, la tabla de retorno tiene el siguiente aspecto

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

Creé una interfaz de usuario para permitir a los usuarios del sistema actualizar los diferentes campos como Accesorios, Descripción, Especificación. La actualización funciona si actualizo todos los campos con la consulta que se muestra en la parte superior. Sin embargo, cuando dejo un cuadro de texto vacío, aparece un error de que al parámetro @ le falta un valor. Así que tratando de encontrar una solución para actualizar solo el campo donde está escrito algo. Entonces, si @parameter IS NULL, mantenga el valor original en la base de datos. Encontré otra solución que está muy cerca de lo que quiero pero no puedo hacer que funcione. Aquí está la otra solución: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0

Bisoño
fuente
¿Puedes proporcionar este error exacto? ¿Es un error del servidor SQL o un error en su aplicación (UI)? ¿Qué UPDATEdeclaración envía la IU a la base de datos?
ypercubeᵀᴹ
¿Puedes agregar eso en la pregunta? Puede ser con cómo se construye la declaración y qué comillas se usan. El '@'Accessoriesno tiene sentido para mí.
ypercubeᵀᴹ
1
Creo que su código de UI puede no estar produciendo declaraciones válidas. Muéstranos el código que tienes y produce el error, no el pseudocódigo.
ypercubeᵀᴹ
Quiero agradecerte de nuevo por la ayuda. Perdón por mi falta de experiencia. Logré encontrar el error, y tenías razón, el problema estaba en el nivel de la interfaz de usuario. Muchas gracias por la ayuda. En caso de que alguien esté buscando una respuesta similar, utilicé la primera solución
Greenhorn el

Respuestas:

13

Creo que esto resolverá el 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 esto (para evitar actualizaciones redundantes):

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 esto, usando un constructor de valores de tabla:

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ᵀᴹ
fuente
Gracias por la rápida respuesta. Lo probaré y le haré saber el resultado.
Greenhorn
¿Te refieres a la segunda solución en mi respuesta?
ypercubeᵀᴹ
Sí, estoy probando la tercera solución, voté por las respuestas porque ofrece muchas posibilidades. Escribo el tercero y si lo hago funcionar lo aceptaré también.
Greenhorn
Todo debería funcionar. Si no lo hacen, puede editar su pregunta y agregar la estructura de la tabla (Crear declaración de tabla) y el Procedimiento almacenado. Puede haber algo relevante que no entiendo bien o que no mencionaste.
ypercubeᵀᴹ
Id, estas respuestas funcionan cuando todos los parámetros no son nulos, pero no funcionan cuando uno de ellos es nulo, luego mire el código de la interfaz de usuario y cómo maneja nulo cuando produce la consulta. Y podría agregar ese código (UI) en la pregunta.
ypercubeᵀᴹ