【问题标题】:How to prevent the trigger from sending an error if the table does not exist?如果表不存在,如何防止触发器发送错误?
【发布时间】:2019-08-16 15:38:50
【问题描述】:

我在删除一行(用户)后编写了触发器来删除名称由该行的 ID 组成的表(但不是每个 ID 都有一个表),如果表中我不喜欢在代码中抛出异常不存在!

CREATE TRIGGER AfterDeleteUser
            ON usersProject
            FOR DELETE
            AS DECLARE @IDres VARCHAR(50),
            @tablename VARCHAR(50)


            SELECT @IDres = ins.IDressource FROM DELETED ins;
            set @tablename = concat('MSG_', @IDres);
            
            SET NOCOUNT ON;
            DECLARE @Sql NVARCHAR(MAX);

            SET @Sql = N'DROP TABLE '+QUOTENAME(@tablename)
        
                EXECUTE sp_executesql @Sql;
            go

当表不存在时出现此错误!

Msg 3701、Niveau 11、État 5、Ligne 7

无法删除表“MSG_”,因为它不存在或您没有权限。

【问题讨论】:

  • 对象名称应使用SysName 而不是VARCHAR(50)
  • 在 SQL Server 2016 中,您可以使用:DROP TABLE IF EXISTS ...
  • 表退出时触发器运行良好
  • @ManelHkiri 好吧,您还有另一个选项,它在两个版本中都适用。
  • 好吧,也许 this demo 可以帮助你了解@ManelHkiri。

标签: sql sql-server tsql triggers


【解决方案1】:

从 SQL Server 2016 开始,您可以使用以下语法:

DROP TABLE IF EXISTS [Tablename]

对于旧版本,您可以这样做:

IF OBJECT_ID('tablename', 'U') IS NOT NULL 
  DROP TABLE tablename; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多