Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将varchar值“UPDATE table SET TypeId=”转换为数据类型int时,转换失败_Sql_Sql Server_Type Conversion - Fatal编程技术网

Sql 将varchar值“UPDATE table SET TypeId=”转换为数据类型int时,转换失败

Sql 将varchar值“UPDATE table SET TypeId=”转换为数据类型int时,转换失败,sql,sql-server,type-conversion,Sql,Sql Server,Type Conversion,我需要用从桌面应用程序作为参数传递的值更新表。但每次尝试运行查询时,我都会遇到以下错误: Msg 245,16级,状态1,第5行 转换varchar值“UPDATE”时转换失败 桌子 设置 TypeId='到数据类型int 我试图通过将代码减少到最低限度来隔离问题,下面是我实际代码的最短片段,但问题仍然存在。我认为这很可能是一个语法问题,但在浏览了一段时间类似的问题后,我似乎仍然无法找出问题所在 DECLARE @typeId int = 175; DECLARE @item varchar(2

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

Msg 245,16级,状态1,第5行 转换varchar值“UPDATE”时转换失败 桌子 设置 TypeId='到数据类型int

我试图通过将代码减少到最低限度来隔离问题,下面是我实际代码的最短片段,但问题仍然存在。我认为这很可能是一个语法问题,但在浏览了一段时间类似的问题后,我似乎仍然无法找出问题所在

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'
您需要将@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转换为字符串以连接它:

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转换为VARCHAR

您需要将@typeId转换为VARCHAR


为什么在这里使用动态sql?这应该是一个简单的参数化查询。您发布的代码易受sql注入攻击


为什么在这里使用动态sql?这应该是一个简单的参数化查询。您发布的代码易受sql注入攻击


我不知道为什么您需要在这里使用动态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;

下面是一个示例,看看它是如何工作的。

我不知道您为什么需要在这里使用动态SQL,因为您可以简单地使用动态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;

下面是一个示例,看看它是如何工作的。

谢谢,这似乎解决了我的问题。如果我的TypeId字段是一个int,它还会被分配为一个整数吗?@SeanMathew是的,您将它转换为一个字符串以用作动态SQL,但是当您查看最终的更新字符串时,如果有意义的话,它是一个数字。i、 e.在动态sql中,您有TypeId=175,这是期望的结果。感谢您的解释,我想我现在已经很好地理解了这个概念@SeanMathew看起来也和SeanLange的答案一样。谢谢,这似乎解决了我的问题。如果我的TypeId字段是一个int,它还会被分配为一个整数吗?@SeanMathew是的,您将它转换为一个字符串以用作动态SQL,但是当您查看最终的更新字符串时,如果有意义的话,它是一个数字。i、 e.在动态sql中,您有TypeId=175,这是期望的结果。感谢您的解释,我想我现在已经很好地理解了这个概念@SeanMathew看起来也和SeanLange的答案一样。