首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以正确的方式编写以下SQL命令- Server 2008 R2

如何以正确的方式编写以下SQL命令- Server 2008 R2
EN

Stack Overflow用户
提问于 2016-12-11 12:24:44
回答 2查看 42关注 0票数 0
代码语言:javascript
运行
复制
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(@TriggerName))
    DROP TRIGGER @TriggerName

我无法找到正确的语法来使用@TriggerName (我认为我在OBJECT_ID中做得很好,但是我找不到正确的DROP TRIGGER名称)。

如果已经存在的话我需要放下扳机。

我从我当前的SQL语句中得到了这个错误:

“@TriggerName”附近语法不正确。期望“.”、ID或Quoted_ID。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-11 12:45:37

我认为您需要为此使用动态SQL:

代码语言:javascript
运行
复制
IF EXISTS (SELECT 1 FROM sys.triggers WHERE object_id = OBJECT_ID(@TriggerName))
BEGIN
    DECLARE @sql nvarchar(max);

    SET @sql = 'DROP TRIGGER @TriggerName';
    SET @sql = REPLACE(@sql, '@TriggerName', @TriggerName);
    exec sp_executesql @sql;
END;

我认为DROP语法不允许变量替换标识符名。

票数 1
EN

Stack Overflow用户

发布于 2016-12-11 12:52:00

不能通过变量在DROP触发器中指定触发器名称。您要么需要一个特定的硬编码名称,要么需要动态SQL (这里实际上是DDL)。

代码语言:javascript
运行
复制
declare @ddl nvarchar(2000)
if exists(...)
begin
    set @ddl=N'drop trigger ' + @triggerName
    exec sp_executesql @ddl
end

无论如何,要小心,不要将用户输入作为触发器名,这将是一个严重的安全风险。

顺便问一句:您为什么不直接查询sys.triggers中的“name”列?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41086123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档