我试图创建一个存储过程来删除表名后面名称模式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'
使用PRINT
与REPLACE
代替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
答案 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