【问题标题】:Conversion failed when converting the varchar value 'UPDATE table SET TypeId = ' to data type int将 varchar 值 'UPDATE table SET TypeId = ' 转换为数据类型 int 时转换失败
【发布时间】:2019-07-08 20:22:22
【问题描述】:

我需要使用从桌面应用程序作为参数传递的值来更新表。但是每次我尝试运行查询时,我都会收到此错误:

消息 245,第 16 级,状态 1,第 5 行 转换 varchar 值 'UPDATE 时转换失败 桌子 放 TypeId = ' 转数据类型 int。

我试图通过将代码减少到最少来隔离问题,下面是我实际代码中最短的 sn-p,但问题仍然存在。我认为这很可能是语法问题,但是在浏览了一段时间后,我似乎仍然无法弄清楚问题所在。

DECLARE @typeId int = 175;
DECLARE @item varchar(20)= 'ABC123'
DECLARE @SQLScript varchar(5000);

SET @SQLScript =   'UPDATE
                        table
                    SET 
                        TypeId = ' + @typeId + '
                    WHERE item = ''' + @item + '''
                   '
Print(@SQLScript);

我期望从Print(@SQLScript) 得到的结果是 查询:

UPDATE
    table
SET
    TypeId = 175
WHERE
    item = 'ABC123'

【问题讨论】:

    标签: sql sql-server type-conversion


    【解决方案1】:

    您需要将@typeID 转换为字符串才能连接它:

    DECLARE @typeId int = 175;
    DECLARE @item varchar(20)= 'ABC123'
    DECLARE @SQLScript varchar(5000);
    
    SET @SQLScript = 'UPDATE
                          table
                      SET 
                          TypeId = ' + CONVERT(VARCHAR(128),@typeId) + '
                      WHERE item = ''' + @item + '''
                      '
    PRINT(@SQLScript);
    

    【讨论】:

    • 谢谢,这似乎解决了我的问题。如果我的 TypeId 字段是 int,是否仍将其分配为整数?
    • @SeanMathew 是的,您将其转换为字符串以用作动态 SQL,但是当您查看最终更新字符串时,如果这有意义的话,它是一个数字。即在动态 sql 中你有 TypeId = 175 这是想要的结果。
    • 谢谢你的解释,我想我现在理解这个概念了!
    • @SeanMathew 看起来也是 SeanLange 的答案。
    【解决方案2】:

    你为什么在这里使用动态 sql?这应该是一个简单的参数化查询。您发布的代码容易受到 sql 注入的影响。 http://bobby-tables.com/

    DECLARE @typeId int = 175;
    DECLARE @item varchar(20)= 'ABC123'
    
    UPDATE
        table
    SET 
        TypeId = @typeId
    WHERE item = @item
    

    【讨论】:

      【解决方案3】:

      我不知道你为什么需要在这里使用动态 SQL,因为你可以简单地这样做

      DECLARE @TypeId INT = 175,
              @Item VARCHAR(20) = 'ABC123';
      
      UPDATE T
      SET TypeId = @TypeId
      WHERE Item = @Item;
      

      但如果你真的需要使用动态 SQL,那就用正确的方式

      DECLARE @TypeId INT = 175,
              @Item VARCHAR(45) = 'ABC123';
              
      EXEC sp_executesql N'UPDATE T SET TypeId = @TypeId WHERE Item = @Item',
                         N'@TypeId INT, @Item VARCHAR(45)',
                         @TypeId,
                         @Item;
      

      这里是db<>fiddle,看看它是如何工作的。

      【讨论】:

        【解决方案4】:

        您需要将@typeId 转换为VARCHAR

        SET @SQLScript =   'UPDATE
                                table
                            SET 
                                TypeId = ' + CAST(@typeId AS VARCHAR(10)) + '
                            WHERE item = ''' + @item + '''
        

        【讨论】:

          猜你喜欢
          • 2011-12-01
          • 2012-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多