在变量中执行动态查询时出错

时间:2019-06-25 03:43:09

标签: sql sql-server tsql dynamic-sql

我正在从变量执行动态查询,但始终显示:

  

找不到存储过程

我尝试使用更简单的查询,例如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 个答案:

答案 0 :(得分:2)

代替EXEC @query使用EXEC sp_executesql @query。来自docs

  

执行可重复使用的Transact-SQL语句或批处理   次,或者是动态生成的。 Transact-SQL   语句或批处理可以包含嵌入式参数。

或者,如果您想使用EXEC,请将其更改为:

EXEC (@query)   

从您的文档中获得:

  

执行一个字符串{EXEC |执行}
      ({@string_variable | [N]'tsql_string'} [+ ... n])
      [AS {登录| USER} ='name'] [;]

这意味着您的@string_variable或字符串必须用()包装。