我有一个存储过程,该过程为所选数据库复制表,并且需要为此数据库中的每个表创建触发器,以更新重复项。 我写了一个sql命令,该命令应该为数据库创建一个触发器,但是如果通过EXEC sp_executesql @sqlcommand执行,则返回“目标不在当前数据库中”,则该命令不起作用。
我试图通过从MSQL SMS的“更改触发器”模板(例如USE db,go等)中包含标准代码来修复它并执行它,但是它拒绝再次工作,并返回“ GO附近的语法不正确”和“ CREATE TRIGGER必须是查询批处理中的第一条语句。”
命令现在的样子:
SET @sqlcom = CONCAT(
'
USE [', @table_db_name, ']
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[UPD_IN_ST', @table_name ,']
ON [', @table_db_name, '].[dbo].[', @table_db_name, @table_name, '] AFTER UPDATE
AS
BEGIN
DECLARE @UPDTime DateTime
SET @UPDTime = getdate()
SELECT * INTO tmp FROM DELETED
SELECT * FROM tmp
SELECT * FROM tmp
UPDATE ', @table_db_name, '.dbo.ReplicaOf', @table_db_name, @table_name, '
SET DateAndTimeOfUpdate = @UPDTime,
UpdateType = ''Update''
FROM ', @table_db_name, '.dbo.ReplicaOf', @table_db_name, @table_name, ', tmp
WHERE ', @table_db_name, '.dbo.ReplicaOf', @table_db_name, @table_name, '.id = tmp.id
DROP TABLE tmp
END')
PRINT @sqlcom
EXEC sp_executesql @sqlcom
其中@table_db_name是带有表的数据库的名称。
我尝试在“创建查询”中使用@sqlcom生成的代码,并且效果很好,MSSQL SMS在给定表中为给定数据库创建了一个触发器。 (@sqlcom中的代码):
USE [test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[UPD_IN_STtestunis]
ON [test].[dbo].[unis] AFTER UPDATE
AS
BEGIN
DECLARE @UPDTime DateTime
SET @UPDTime = getdate()
SELECT * INTO tmp FROM DELETED
SELECT * FROM tmp
SELECT * FROM tmp
UPDATE test.dbo.ReplicaOftestunis
SET DateAndTimeOfUpdate = @UPDTime,
UpdateType = 'Update'
FROM test.dbo.ReplicaOftestunis, tmp
WHERE test.dbo.ReplicaOftestunis.id = tmp.id
DROP TABLE tmp
END
此触发器按预期工作。 因此,我不明白为什么我尝试使用EXEC sp_executesql @sqlcom创建触发器的原因。