/ / SQL query error: Falha na conversão ao converter o valor varchar - sql, sql-server, parameters, data-conversion

Erro na consulta SQL: Falha na conversão ao converter o valor varchar - sql, sql-server, parâmetros, conversão de dados

Eu pesquiso sobre o erro, mas só encontro respostas diferentes que não funcionaram para mim.

Eu tenho essa consulta, no SQL Server:

DECLARE @column_name varchar (25),
@data_column int,
@table_name varchar (25)

DECLARE @mySql nvarchar (MAX)

SET NOCOUNT ON;

SET @column_name = "Excellent"
SET @table_name = "CSAT"
SET @data_column = 10

SET @mySql = "INSERT INTO "+@table_name+"("+@column_name+") VALUES("+@data_column+")"
EXEC (@mySql)

Quando eu executo, me mostra este erro:

A conversão falhou ao converter o valor varchar "INSERT INTO CSAT (Excellent) VALUES (" para tipo de dados int.

Todas as colunas são Int e permitem nulos.

Eu tenho que fazer uma conversão ou algo assim? Eu aprecio sua ajuda!

Respostas:

4 para resposta № 1

@data_column é um int, então você precisa convertê-lo em varchar porque está construindo uma string.

SET @mySql = "INSERT INTO "+@table_name+"("+@column_name+")
VALUES("+ Convert(Varchar(10), @data_column)+")"

Quando o sql server encontra uma expressão que mistura strings e int, ele tenta converter a string em um int (em vez do contrário). Isso está documentado aqui: Precedência de tipo de dados do SQL Server


0 para resposta № 2

adicione algum espaço como este

SET @mySql = "INSERT INTO "+@table_name+" ("+convert(varchar(50),@column_name)+") VALUES("+@data_column+")"

0 para resposta № 3

O sql está tentando fazer uma soma de sua string on line:

SET @mySql = "INSERT INTO "+@table_name+"("+@column_name+") VALUES("+@data_column+")"

Altere o parâmetro @data_column de int para varchar ou use uma função CONCAT para criar seu comando SQL:

SET @mySql = CONCAT("INSERT INTO ",@table_name," (",@column_name,") VALUES(",@data_column,")")

0 para a resposta № 4

Você deve usar a consulta parametrizada para fazer isso, também usar o tipo de dados apropriado para nomes de objetos ...

algo assim....

SET NOCOUNT ON;

DECLARE @column_name  SYSNAME
,@data_column  INT
,@table_name   SYSNAME
,@mySql        NVARCHAR(MAX);

SET @column_name = "Excellent"
SET @table_name = "CSAT"
SET @data_column = 10

SET @mySql = N" INSERT INTO "+ QUOTENAME(@table_name)
+  N" ("+ QUOTENAME(@column_name) +") "
+  N" VALUES( @data_column )"


Exec sp_executesql @mySql
,N"@data_column INT"
,@data_column