T-SQL Используйте переменную в качестве имени таблицы - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь объединить несколько хранимых процедур в SSMS в одну.Все процедуры были довольно похожи по функциям: просмотрите таблицу и измените значение данного поля на заданную переменную.Единственными реальными различиями между процедурами были таблицы и поля, на которые они ссылались.

Основываясь на других сообщениях здесь на SO, я пришел к следующему:

DECLARE @strQuery NVARCHAR(500)

SET @strQuery = 
    'UPDATE ' + @strTableName + 
    ' SET ' + @strField + ' = ' + @strNewFieldValue + 
    ' WHERE primaryKey = ' + CAST(@intNumber AS NVARCHAR(50));

EXECUTE @strQuery

Однако, когда я пытаюсь запустить его, я получаю следующую ошибку:

Не удалось найти хранимую процедуру 'ОБНОВЛЕНИЕ dbo.tableName SET dbo.Field = NewFieldValue WHERE pri

Это запрос, который я хотел выполнить с отключенным последним битом.Изменение размера переменной @strQuery не влияет на длину сообщения об ошибке.Я что-то упускаю?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Используйте sp_execute_sql.И параметры:

DECLARE @strQuery NVARCHAR(MAX);

SET @strQuery = '
UPDATE ' + strTableName + '
    SET ' + @strField + ' = @strNewFieldValue 
    WHERE primaryKey = @intNumber';

EXEC sp_executesql @strQuery,
                   N'@strNewFieldValue varchar(255), @intNumber int',
                   @strNewFieldValue=@strNewFieldValue, @intNumber=@intNumber;

Обратите внимание, что буквенные значения заменяются параметрами.Даже если внедрение SQL-кода не является проблемой, это упрощает запрос и гарантирует, что странные символы в значениях не будут чрезмерно влиять на запрос.

Кроме того, SQL Server позволяет строкам занимать строки.Поэтому я использовал эту функцию, чтобы удалить некоторые одинарные кавычки.

0 голосов
/ 27 сентября 2018

Попробуйте

EXECUTE (@strQuery)

См. документы и обратите внимание на круглые скобки в синтаксисе для «Выполнить строку символов».Без скобок SQL Server считает, что вы хотите выполнить хранимую процедуру.

0 голосов
/ 27 сентября 2018
...