Ошибка преобразования при преобразовании значения varchar 'UPDATE table SET TypeId =' в тип данных int - PullRequest
1 голос
/ 08 июля 2019

Мне нужно обновить таблицу со значениями, передаваемыми в качестве параметров из настольного приложения.Но каждый раз, когда я пытаюсь выполнить запрос, я просто получаю эту ошибку:

Сообщение 245, Уровень 16, Состояние 1, Строка 5 Преобразование завершается неудачно при преобразовании значения varchar 'UPDATE table SET 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);

Что я ожидаю получить в результатеиз печати (@SQLScript) это запрос:

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

Ответы [ 4 ]

2 голосов
/ 08 июля 2019

Почему вы вообще используете динамический sql?Это должен быть простой параметризованный запрос.Код, который вы разместили, уязвим для внедрения SQL.http://bobby -tables.com /

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

UPDATE
    table
SET 
    TypeId = @typeId
WHERE item = @item
1 голос
/ 08 июля 2019

Я не знаю, почему вам нужно использовать динамический 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 <> скрипка , чтобы увидеть, как она работает.

1 голос
/ 08 июля 2019

Вам нужно прикрыть @typeId для VARCHAR

SET @SQLScript =   'UPDATE
                        table
                    SET 
                        TypeId = ' + CAST(@typeId AS VARCHAR(10)) + '
                    WHERE item = ''' + @item + '''
1 голос
/ 08 июля 2019

Вам нужно преобразовать @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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...