SE NÃO NULL, UPDATE, caso contrário, mantenha o valor do campo

10

Eu acho que estou de alguma forma perto de fazê-lo funcionar, mas por algum motivo ainda recebo erros.

Eu tenho a seguinte consulta UPDATE:

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

Os parâmetros são preenchidos por diferentes usuários. O problema que enfrento agora é que, mesmo quando você deseja atualizar um único campo, ainda precisa preencher com os dados antigos os outros parâmetros. Portanto, eu gostaria de definir a opção IF @parameter IS NULL THEN, em seguida, mantenha o valor que já está armazenado no banco de dados. Tentei encontrar alguma solução e algo como a seguinte consulta parece ser a solução, mas não consigo fazê-la funcionar:

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

O banco de dados é armazenado no SQL Server 2008

Obrigado antecipadamente pela ajuda.

EDIT para esclarecer:

A tabela original fica assim

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

Por motivos de publicação, fiz uma consulta para virar a tabela. Portanto, quando a consulta Select é executada, a tabela de retorno se parece com a seguinte

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

Criei uma interface do usuário para permitir que os usuários do sistema atualizassem os diferentes campos, como Acessórios, Descrição, Especificação. A atualização funciona se eu atualizar todos os campos com a consulta mostrada na parte superior. No entanto, quando deixo uma caixa de texto vazia, recebo um erro informando que o parâmetro @ está faltando um valor. Então, tentando encontrar uma solução para atualizar apenas o campo onde está algo escrito. Portanto, se @parameter IS NULL, mantenha o valor original no banco de dados. Encontrei outra solução muito próxima do que eu quero, mas não consigo fazê-lo funcionar. Aqui está a outra solução: /programming/9387839/mysql-if-not-null-then-display-1-else-display-0

Greenhorn
fonte
Você pode fornecer esse erro exato? É um erro do SQL-Server ou um erro no seu aplicativo (UI)? Que UPDATEdeclaração a interface do usuário envia ao banco de dados?
ypercubeᵀᴹ
Você pode adicionar isso na pergunta? Pode ser como a declaração é construída e quais aspas são usadas. O '@'Accessoriesque não faz sentido para mim.
ypercubeᵀᴹ
11
Eu acho que seu código de interface do usuário pode não estar produzindo instruções válidas. Mostre-nos o código que você possui e produz o erro, não o pseudo-código.
precisa saber é o seguinte
Quero agradecer a você pela ajuda. Desculpe pela minha falta de experiência. Consegui encontrar o erro e você estava certo: o problema estava no nível da interface do usuário. Muito obrigado pela ajuda. No caso de alguém estar procurando uma resposta semelhante, usei a primeira solução
Greenhorn 15/03

Respostas:

13

Eu acho que isso resolverá o 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 ;

ou isso (para evitar atualizações 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
      ) ;

ou isso, usando um construtor de valor de tabela:

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ᵀᴹ
fonte
Obrigado pela resposta rápida. Vou experimentá-lo e informá-lo do resultado.
Greenhorn
Você quer dizer a segunda solução na minha resposta?
ypercubeᵀᴹ
sim, estou tentando a terceira solução, votei nas respostas porque ela oferece muitas possibilidades. Eu digito o 3º e se o fizer funcionar, também o aceitarei.
Greenhorn
Tudo deve funcionar. Caso contrário, você pode editar sua pergunta e adicionar a estrutura da tabela (instrução Create Table) e o Stored Procedure. Pode haver algo relevante que eu entenda mal ou você não mencionou.
ypercubeᵀᴹ
Se essas respostas funcionarem quando todos os parâmetros não forem nulos, mas não funcionarem quando um deles for nulo, verifique o código da interface do usuário e como ele lida com o nulo ao produzir a consulta. E você pode adicionar esse código (UI) à pergunta.
ypercubeᵀᴹ