首页 > 解决方案 > 在变量中执行动态查询时出错

问题描述

我正在从变量执行动态查询,但它总是说:

找不到存储过程

我试图使用更简单的查询,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

在我的临时表中是我所有触发器名称的列表,因此我想要获得的预期输出是命令成功完成。不是“找不到存储过程”,因为我应该执行动态查询而不是存储过程。

标签: sqlsql-servertsqldynamic-sql

解决方案


而是EXEC @query使用 , EXEC sp_executesql @query。从文档

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

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

EXEC (@query)   

从您拥有的文档中:

执行字符串 { EXEC | 执行 }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { 登录 | 用户 } = '名字' ] [;]

这意味着您的 @string_variable 或字符串必须包含在().


推荐阅读