SQL Таблица сервера не обновляется динамической c хранимой процедурой - PullRequest
0 голосов
/ 27 марта 2020

В последние пару дней я выдергиваю волосы из-за моей проблемы.

В хранимой процедуре я хочу использовать имя столбца в качестве параметра для обновления значения в таблице.

У меня есть следующий код

ALTER PROCEDURE [dbo].[Item_Update_Single]
    @Id nvarchar(15), 
    @ColumnName nvarchar(80),
    @NewValue nvarchar(80)
AS 
    DECLARE @sql NVARCHAR(MAX)

    SET @sql = N'UPDATE [Item] SET [' + QUOTENAME(@ColumnName) + ']' + '= ' + QUOTENAME(@NewValue) +' WHERE [Id] = ' + @Id

    PRINT @sql

Хранимая процедура работает нормально, ошибок нет, но таблица не обновляется. Если я запускаю строку @SQL в окне запроса, данные обновляются.

Я как бы новичок ie, но что я тут не так сделал?

1 Ответ

3 голосов
/ 27 марта 2020

Вы никогда не выполните свой динамический оператор c. Ваше использование QUOTENAME также неправильно. '[' + QUOTENAME(@ColumnName) + ']' приведет к [[ColumnName]], а QUOTENAME(@NewValue) будет относиться к столбцу с именем какого-либо значения в @NewValue, а не к строковому литералу. Вы должны параметризовать оператор и правильно ввести динамический c объект:

ALTER PROCEDURE [dbo].[Item_Update_Single] @Id int, --Guess this is actually an int
                                           @ColumnName sysname, --Corrected data type
                                           @NewValue nvarchar(80) --I assume this is correct

AS 
BEGIN

    DECLARE @sql NVARCHAR(MAX);

    SET @sql = N'UPDATE dbo.[Item] SET ' + QUOTENAME(@ColumnName) + ' = @NewValue WHERE [Id] = @ID;'

    EXEC sys.sp_executesql @SQL, N'@NewValue nvarchar(80),@Id int', @NewValue, @ID;

END

Это, однако, похоже на XY Проблема . Подобные решения почти всегда являются плохой идеей и часто выводят значительный недостаток дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...