很难用spms发现sp_executesql的错误

时间:2017-08-14 19:33:03

标签: sql-server stored-procedures

我试图创建一个存储过程来删除表名后面名称模式basead的所有触发器(之后我将创建另一个触发器)。

首先,我尝试使用游标列出以__ATTACH结尾的所有表,然后检查此表是否具有名称以UPDATE_ATT_NAME__开头的触发器,如果​​存在,则删除这个触发器。

我的sp:

DECLARE @table_name NVARCHAR(MAX);
DECLARE @trigger_name NVARCHAR(MAX);
DECLARE tables_cursor CURSOR FOR
  SELECT TABLE_NAME
  FROM INFORMATION_SCHEMA.TABLES
  WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME LIKE '%ATTACH'
  FOR READ ONLY;

OPEN tables_cursor

FETCH NEXT FROM tables_cursor INTO @table_name

WHILE @@FETCH_STATUS = 0
  BEGIN
    /* Check if trigger exists */
    SET @trigger_name = CONCAT('UPDATE_ATT_NAME__', @table_name);
    IF (EXISTS(SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(@trigger_name)))
      /* drop trigger */
      BEGIN
        DECLARE @sql NVARCHAR(MAX);
        DECLARE @param NVARCHAR(MAX);

        SET @sql = N'DROP TRIGGER @tn';
        SET @param = N'@tn NVARCHAR(MAX)';

        EXECUTE sp_executesql @sql, @param, @tn = @trigger_name;
      END

    FETCH NEXT FROM tables_cursor INTO @table_name
  END
CLOSE tables_cursor;
DEALLOCATE tables_cursor;

但是我总是收到这样的东西(我的sql server它不是英文的,所以,我不知道英文上的正确错误信息 - 我已翻译过):

Incorrect syntax found during sp_executesql next to '@tn'

使用PRINTREPLACE代替EXECUTE sp_executesql(穷人调试),我没有发现任何错误。

PRINT REPLACE(@sql, '@tn', @trigger_name)

得到DROP TRIGGER UPDATE_ATT_NAME__TEST_TABLE_NAME__ATTACH

UPDATE, 我使用

工作了
SET @sql = N'DROP TRIGGER ' + @trigger_name;
EXECUTE sp_executesql @sql;

但我真的不知道如何使用params

1 个答案:

答案 0 :(得分:2)

为什么不是这样的东西呢?这里我们利用系统对象来生成动态sql。

declare @SQL nvarchar(max) = ''

SELECT @SQL = @SQL + 'drop trigger ' + t. name + ';'
FROM sys.triggers t
join sys.objects o on t.parent_id = o.object_id
where o.name like '%ATTACH'
    and t.name like 'UPDATE_ATT_NAME__%'

select @SQL --uncomment the following line when satisfied the dynamic sql generated is correct
--exec sp_executesql @SQL