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

时间:2016-12-11 12:24:45

标签: sql sql-server sql-server-2008-r2

[supervisord]
nodaemon=true

[program:openfire]
command=/etc/init.d/openfire start

[supervisorctl]
serverurl=http://localhost:8090

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[inet_http_server]
port = 8090

我无法找到使用IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(@TriggerName)) DROP TRIGGER @TriggerName 的正确语法(我想我在@TriggerName内做得很好,但我找不到{{1}的正确方法1}}名称)。

如果已经存在,我需要放下触发器。

我从当前的SQL语句中得到此错误:

  

' @ TriggerName'附近的语法不正确。期待'。',ID或Quoted_ID。

2 个答案:

答案 0 :(得分:1)

我认为你需要使用动态SQL:

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 :(得分:0)

您无法通过变量在DROP TRIGGER中指定触发器名称。您需要特定的硬编码名称或动态SQL(此处实际为DDL)。

declare @ddl nvarchar(2000)
if exists(...)
begin
    set @ddl=N'drop trigger ' + @triggerName
    exec sp_executesql @ddl
end

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

顺便说一句:你有没有理由不查询这个名字' sys.triggers中的列直接?