我有一个查询,我可以从sys.databases中选择我想要更新的触发器的数据库。从那里我可以创建一个游标。但是当我进入光标以使用设置为@DatabaseExecuteName
的动态数据库名称MyDatabaseName.dbo
更新我的触发器时,我收到错误''CREATE/ALTER TRIGGER' does not allow specifying the database name as a prefix to the object name.'
因为我在光标中我无法执行USE MyDatabaseName
... GO,CURSOR中不允许使用GO语句。我已尝试使用:setvar DatabaseName "MyDatabaseName"
的SQLCMD MODE USE [$(DatabaseName)];
来尝试设置use数据库。我觉得我很亲密,但我的力量不是SQL查询。我可以在我缺少的东西上使用一些帮助。
答案 0 :(得分:1)
您可以嵌套EXEC
来电,以便您可以使用USE
,然后执行进一步的声明,而您不需要使用GO
来分隔批次。这是一个演示该技术的完整脚本:
create database DB1
go
create database DB2
go
use DB2
go
create table T1 (ID int not null)
go
create table T2 (ID int not null)
go
use DB1
go
exec('use DB2; exec(''create trigger T_T on T1 after insert as
insert into T2(ID) select i.ID from inserted i'')');
select DB_NAME()
insert into DB2..T1(ID) values (1),(2);
select * from DB2..T2
然后显示此连接仍在DB1
数据库中,但在T1
数据库中的DB2
表上成功创建了触发器。
你必须注意的是让你的报价逃脱正确。