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

Correção da Msg 8116 “A data do tipo de dados do argumento é inválida para o argumento 1 da função substring” no SQL Server


Se você estiver recebendo a mensagem de erro 8116 do SQL Server com texto que diz A data do tipo de dados do argumento é inválida para o argumento 1 da função de substring , é porque você está passando o tipo de dados errado para uma função – neste caso, o SUBSTRING() função.

Você também pode ver o mesmo erro (Msg 8116) em muitos outros contextos - não está limitado ao SUBSTRING() função.

Exemplo do erro


Aqui está um exemplo de código que produz o erro:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);

Resultado:
Msg 8116, Level 16, State 1, Line 2
Argument data type date is invalid for argument 1 of substring function.

Aqui, passei uma date digite como o primeiro argumento para SUBSTRING() , mas isso não é permitido.

A SUBSTRING() A função aceita um caractere, binário, texto, ntext ou expressão de imagem como seu primeiro argumento. Se você passar um argumento que não seja um desses tipos aceitos, ocorrerá o erro acima.

Como mencionado, isso pode acontecer com outras funções também. De qualquer forma, isso significa que você está passando o tipo de dados errado para a função.

Solução 1


Primeiro, se você estiver passando uma coluna, verifique se acertou na coluna. A solução pode ser uma simples questão de substituir o nome de coluna incorreto pelo nome de coluna correto.

O mesmo se você estiver passando uma variável - verifique se é a variável correta. Você pode resolver esse problema substituindo a variável incorreta pela correta.

Solução 2


Se você tiver certeza de que obteve o nome/variável de coluna correto, uma maneira de corrigir esse erro é converter o argumento para o tipo de dados apropriado.

Por exemplo, poderíamos ajustar o exemplo acima para o seguinte:
DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);

Resultado:
2020

Solução 3


Mas antes de converter qualquer coisa, às vezes vale a pena dar um passo atrás e pensar se há uma maneira mais simples de produzir o resultado desejado.

Por exemplo, no exemplo acima, tudo o que estamos tentando fazer é extrair o ano da data. Nesse caso, talvez seja melhor acabar com o SUBSTRING() função completamente, em favor do YEAR() função:
DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);

Resultado:
2020

Outra maneira de fazer isso seria usar o FORMAT() função:
DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');

Resultado:
2020