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
在我的临时表中是我所有触发器名称的列表,因此我想要获得的预期输出是命令成功完成。不是“找不到存储过程”,因为我应该执行动态查询而不是存储过程。
解决方案
而是EXEC @query
使用 , EXEC sp_executesql @query
。从文档:
执行可以多次重复使用的 Transact-SQL 语句或批处理,或者动态构建的语句或批处理。Transact-SQL 语句或批处理可以包含嵌入式参数。
或者,如果您想使用EXEC,请将其更改为:
EXEC (@query)
从您拥有的文档中:
执行字符串 { EXEC | 执行 }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { 登录 | 用户 } = '名字' ] [;]
这意味着您的 @string_variable 或字符串必须包含在()
.
推荐阅读
- android - 保持片段状态的Android底部导航
- azure-devops - 如何从 azure devops rest api 获得过去 n 个工作项的交互
- c - 使用 Mac 从控制台读取 UTF-8 字符
- spring - JUnit Test 错误地传递了错误的参数
- amazon-web-services - 使用 AWS 网关的 API 版本控制(非 lambda 函数)
- halide - 如何通过 JIT 在 Halide 中使用 define_extern?
- python - 如何从 python 调用中获取命令 docker shell 提示符
- android - Android、Tomcat 和 Postman:捕获 HTTP 请求
- vba - 执行 vba 查询 ms 访问时出现运行时错误 3075
- webpack - 纱线安装失败,模块解析失败:意外字符“@”(1:0)