2011-12-12 15 views
0

好的。我有一个数据库,有一堆存储过程,并引用另一个数据库是这样的:查询中的动态数据库实例

select * from DatabaseName.dbo.tableName... or 
Insert into DatabaseName.dbo.tableName.... 

所以。它在存储过程中引用它约500-1000次。现在,什么情况是,我需要运行从一个数据库引用另一个数据库中的这些存储过程是这样的:据我了解SQL Server 2008 R2中没有任何新的东西,可以帮助它,我

select * from AnotherDatabaseName.dbo.tableName... or 
Insert into AnotherDatabaseName.dbo.tableName.... 

每次都必须使用参数来构建动态查询,对吧?如果是这样,是否有任何体面的简单方法来做到这一点? 我需要更改每个存储过程并添加一个参数@DatabaseInstance。另外,我需要重新配置所有查询。听起来很可怕。任何自动化工具或东西来帮助?

+0

可能重复[如何将数据库名称作为SP中的变量?](http://stackoverflow.com/ question/3578070/how-to-have-database-name-as-variable-in-an-sp) – Pondlife

回答

1

使用代码可以在数据库中为数据库创建同义词。即我在SP中使用此代码插入到基于参数(区域)的指定数据库中

IF EXISTS (SELECT * FROM sys.synonyms WHERE name = N'TABLE_SYNONYM') DROP SYNONYM [dbo].[TABLE_SYNONYM] 
IF @region_id not in (2,3) CREATE SYNONYM [dbo].[TABLE_SYNONYM] FOR [DB_US].[dbo].[mytable] 
IF @region_id = 2 CREATE SYNONYM [dbo].[TABLE_SYNONYM] FOR [DB_EU].[dbo].[mytable] 
IF @region_id = 3 CREATE SYNONYM [dbo].[TABLE_SYNONYM] FOR [DB_Asia].[dbo].[mytable] 

insert into [dbo].[TABLE_SYNONYM] (...) select .... 
+0

这看起来很有趣。我只能为特定表格做同义词吗?我仍然不明白为什么我们最后需要插入声明。 – user194076

+0

您可以创建同义词: 大会(CLR)存储过程, 大会(CLR)表值函数, 大会(CLR)标量函数, 大会总结(CLR)聚合函数, 复制 - 过滤程序, 扩展存储的过程, SQL标量函数, SQL表值函数, SQL直列表值函数, SQL存储过程, 视图, 表1(用户定义的), 插入语句仅是一个例子。你可以用底层对象所允许的同义词做所有事情。 –