SQL查询错误:转换varchar值时转换失败

SQL查询错误:转换varchar值时转换失败,sql,sql-server,parameters,data-conversion,Sql,Sql Server,Parameters,Data Conversion,我搜索错误,但我只找到不同的答案,对我来说并不适用 我在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

我搜索错误,但我只找到不同的答案,对我来说并不适用

我在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)
当我执行它时,它会显示以下错误:

将varchar值“INSERT”转换为CSAT(优秀)值(”转换为数据类型int时,转换失败

所有列都是Int,并且允许为null


我必须进行转换或其他什么?非常感谢您的帮助!

@data\u列是一个int,因此您需要将其转换为varchar,因为您正在生成一个字符串

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

当sql server遇到一个混合了字符串和int的表达式时,它会尝试将字符串转换为int(而不是相反的方式)。这里记录了这一点:

@data\u列是int,所以您需要将其转换为varchar,因为您正在生成字符串

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

当sql server遇到一个混合了字符串和int的表达式时,它会尝试将字符串转换为int(而不是相反)

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

像这样添加一些空间

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

sql正在尝试对第行中的字符串求和:

SET @mySql = 'INSERT INTO '+@table_name+'('+@column_name+') VALUES('+@data_column+')'
将@data_column参数从int更改为varchar,或使用CONCAT函数创建SQL命令:

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

sql正在尝试对第行中的字符串求和:

SET @mySql = 'INSERT INTO '+@table_name+'('+@column_name+') VALUES('+@data_column+')'
将@data_column参数从int更改为varchar,或使用CONCAT函数创建SQL命令:

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

您应该使用参数化查询来执行此操作,还应该为对象名称使用适当的数据类型

像这样的

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 

您应该使用参数化查询来执行此操作,还应该为对象名称使用适当的数据类型

像这样的

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 

如果对照数据库中的表和列检查列名称和表名称,则不存在漏洞。如果对照数据库中的表和列检查列名称和表名称,则不存在漏洞。