Ошибка при выполнении динамических запросов в переменной - PullRequest
1 голос
/ 25 июня 2019

Я выполняю динамический запрос из переменной, но он всегда говорит:

Не удалось найти хранимую процедуру

Я пытался использовать более простые запросы, такие как set @query = 'select * from [table_name]', но выдает ту же ошибку.

CREATE TABLE #test(
  id int identity (1,1) not null,
  name varchar(200)
)

DECLARE @TRIGER_NAME VARCHAR(200)
DECLARE @V_MAX INT
DECLARE @V_MIN INT
DECLARE @QUERY VARCHAR(MAX)

SELECT @V_MAX = MAX(id)
FROM #test

SELECT @V_MIN=Min(id)
FROM #test

WHILE @V_MIN <= @V_MAX
BEGIN
  SELECT @TRIGER_NAME = name
  FROM #test
  WHERE id = @V_MIN

  SET @QUERY = 'DROP TRIGGER '+ @TRIGER_NAME;
  EXEC @query
  SET @V_MIN = @V_MIN+1
END

В моей временной таблице указан список всех моих имен триггеров, поэтому ожидаемый вывод, который я хочу получить, - это команда (и), успешно выполненная.Не «Не удалось найти хранимую процедуру», потому что я должен выполнять динамические запросы, а не хранимую процедуру.

1 Ответ

2 голосов
/ 25 июня 2019

Вместо EXEC @query используйте, EXEC sp_executesql @query.Из документов :

Выполняет инструкцию или пакет Transact-SQL, которые могут многократно использоваться многократно, или динамически создаваемый.Инструкция или пакет Transact-SQL могут содержать встроенные параметры.

Или, если вы хотите использовать EXEC , измените его на:

EXEC (@query)   

Изимеющаяся у вас документация:

Выполнить строку символов {EXEC |EXECUTE}
({@string_variable | [N] 'tsql_string'} [+ ... n])
[AS {LOGIN |USER} = 'name'] [;]

, что означает, что ваша @string_variable или строка должны быть заключены в ().

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