在SQL脚本中参数化数据库名称

时间:2014-11-13 14:43:57

标签: sql-server sql-server-2012

我正在编写一个数据迁移脚本,用于将具有相同模式的3个独立数据库中的数据导入新数据库。所有数据库都驻留在同一个SQL Server实例上。

将查询复制并粘贴3次似乎非常浪费:

insert NewTable(NewField1, NewField2)
select OldField1, OldField2 
  from OldDb1..OldTable

insert NewTable(NewField1, NewField2)
select OldField1, OldField2 
  from OldDb2..OldTable

insert NewTable(NewField1, NewField2)
select OldField1, OldField2 
  from OldDb3..OldTable

...显然,如果我需要调整脚本,那将是一个噩梦...加上我很幸运,只有3个数据库,但如果有100个数据库怎么办?

最重要的是,我想编写一个以数据库名称作为参数的脚本,这样我就可以运行一个脚本3次,例如

create proc MigrateData(@db database)
as
insert NewTable(NewField1, NewField2)
select OldField1, OldField2 
  from @db..OldTable

...但当然这种语法不起作用。

我可以这样做:

create proc MigrateData(@db varchar(50))
as
begin
  declare @cmd varchar(max);
  set @cmd = 'insert NewTable(NewField1, NewField2)
    select OldField1, OldField2 
    from '+@db+'..OldTable';

  exec @cmd;
end

但是...... 哎呀!

我该怎么做?

1 个答案:

答案 0 :(得分:2)

为什么不将它切换到外部数据库而不是从外部数据库中进行SELECT?这样您就可以从每个外部数据库运行脚本,或者只需更改第一行以使用正确的源。

例如:

USE OldDatabase1

GO
insert NewDatabase.NewTable(NewField1, NewField2)
select OldField1, OldField2 
  from OldTable

或者删除USE语句并让连接确定要开始的正确数据库。

或者,你可能只能使用动态SQL实现你想要的东西,就像你说的那样,你好。