SQL Server - 使用旧版支持重命名和合并数据库

时间:2015-02-05 20:10:58

标签: sql merge sql-server-2008-r2 alias

我有两个Sql Server 2008 R2数据库,名为MyDbOneMyDbTwo

我想将它们(所有表格和程序)合并到一个名为MyDb的新数据库中。

假设它们之间的表和过程名称没有冲突。

问题是:有很多代码和过程使用数据库名称执行查询,包括在其中一个数据库中声明的过程中声明的过程。有以下查询:

select * from MyDbOne..SomeTable;
select * from MyDbTwo..AnotherTable;

SomeTableAnotherTable将存在于MyDb数据库中。但我需要支持使用leagcy名称MyDbOneMyDbTwo来查询它们。如果我要运行上面的查询,我希望它们实际上与:

相同
select * from MyDb..SomeTable;
select * from MyDb..AnotherTable;

有办法吗?也许在新数据库上创建某种全局别名,将MyDbOneMyDbTwo解析为MyDb?那将是完美的,但我不知道该怎么做。

非常感谢!

2 个答案:

答案 0 :(得分:0)

我不认为这有一个问题的解决方案。如果我是你,我会保留现有的MyDbOneMyDbTwo数据库并创建一个全新的数据库,通过视图引用这两个表。基本上,您将创建一个位于这些现有数据库之上的Data Warehouse。这个设置的好处是,你不必重写任何遗留代码,这是巨大的。

答案 1 :(得分:0)

没有简单的方法。您必须手动更新所有这些引用。您可以使用this answer中的一个查询在SQL服务器中搜索包含这些数据库名称的所有对象;

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%Foo%' 
AND ROUTINE_TYPE='PROCEDURE'

SELECT OBJECT_NAME(id) 
FROM SYSCOMMENTS 
WHERE [text] LIKE '%Foo%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
AND definition LIKE '%Foo%'