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


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 ;

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ᵀᴹ
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.