Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Corrigir a mensagem de erro 4151 “O tipo do primeiro argumento para NULLIF não pode ser a constante NULL porque o tipo do primeiro argumento deve ser conhecido” no SQL Server


Se você receber o erro Msg 4151 “O tipo do primeiro argumento para NULLIF não pode ser a constante NULL porque o tipo do primeiro argumento deve ser conhecido ” no SQL Server, é porque você está passando um valor nulo como o primeiro argumento para o NULLIF() função.

Para corrigir esse erro, certifique-se de não passar a constante nula como o primeiro argumento para a função. Ou, se o fizer, converta-o para um tipo de dados específico.

Exemplo do erro


Aqui está um exemplo de código que produz o erro:
SELECT NULLIF(null, 7);

Resultado:
Msg 4151, Level 16, State 1, Line 1
The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.

No SQL Server, o NULLIF() o valor de retorno da função usa o tipo de dados da primeira expressão. Isso significa que o primeiro valor não deve ser a constante nula, visto que a constante nula não tem tipo de dados conhecido.

Este erro deve ser bastante raro. Na maioria dos casos, você passará um nome de coluna como primeiro argumento e, no SQL Server, as colunas têm um tipo de dados definido. Nesses casos, um valor nulo será realmente aceito, pois o SQL Server conhece o tipo de dados da coluna.

O mesmo pode ser dito para as variáveis. Se você passasse uma variável, teria que declarar seu tipo e, portanto, não obteria o erro.

De qualquer forma, se você receber esse erro, tente a seguinte solução.

Solução


Se você receber esse erro, poderá converter a constante nula em um tipo de dados específico:
SELECT NULLIF(CAST(null AS int), 7);

Resultado:
NULL

Neste caso NULL é retornado, porque os dois argumentos são diferentes e NULL é o primeiro argumento.

Se o primeiro argumento for uma coluna, você não precisará se preocupar em converter seu tipo, pois a coluna já possui um tipo de dados.

Suponha que temos um ProductPrice coluna:
SELECT ProductPrice
FROM Products;

Resultado:
+----------------+
| ProductPrice   |
|----------------|
| 25.99          |
| 14.75          |
| 11.99          |
| 0.00           |
| 0.00           |
| NULL           |
| 9.99           |
| 25.99          |
+----------------+

A coluna contém um valor nulo.

No entanto, podemos passar essa coluna para NULLIF() sem causar o erro 4151:
SELECT NULLIF(ProductPrice, 0) AS Result
FROM Products;

Resultado:
+----------+
| Result   |
|----------|
| 25.99    |
| 14.75    |
| 11.99    |
| NULL     |
| NULL     |
| NULL     |
| 9.99     |
| 25.99    |
+----------+

Não obtivemos erro, pois o SQL Server já conhece o tipo de dados da coluna.