【问题标题】:SQL query error: Conversion failed when converting the varchar valueSQL查询错误:转换varchar值时转换失败
【发布时间】:2015-07-03 17:25:47
【问题描述】:

我搜索错误,但只找到对我不起作用的不同答案。

我在 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 INTO CSAT(Excellent) VALUES(' 转换为数据类型 int 时转换失败。

所有列都是 Int 并且允许为空。

我必须进行转换还是什么?感谢您的帮助!

【问题讨论】:

    标签: sql sql-server parameters data-conversion


    【解决方案1】:

    @data_column 是一个 int,所以你需要将它转换为 varchar,因为你正在构建一个字符串。

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

    当 sql server 遇到混合字符串和 int 的表达式时,它会尝试将字符串转换为 int(而不是相反)。这记录在这里:SQL Server Data Type Precedence

    【讨论】:

    • 如果您根据数据库中的表和列检查您的 column_name 和 table_name,则不会存在漏洞。
    【解决方案2】:

    像这样添加一些空间

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

    【讨论】:

      【解决方案3】:

      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,')')
      

      【讨论】:

        【解决方案4】:

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

        类似这样的......

        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 
        

        【讨论】:

          猜你喜欢
          • 2013-12-30
          • 1970-01-01
          • 2017-08-25
          • 1970-01-01
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 2019-07-04
          相关资源
          最近更新 更多