Sql 如何将对DB1的请求重定向到DB2

Sql 如何将对DB1的请求重定向到DB2,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,假设我有两个名为DB1和DB2的数据库。在DB1中有一个名为Student的表,在DB2中有一个名为SP1的存储过程。在SP1中,我使用以下查询选择Student表的数据: 从DB1.dbo.Student中选择* 我有300多个存储过程进行了上述跨数据库通信。现在,我想将我的数据库从DB1更改为DB3,从数据和模式的角度来看,它与DB1相同。 为此,我还必须修改具有完全限定数据库名称的所有300个存储过程。现在,查询可能如下所示: 从DB3.dbo.Student中选择* 我现在不想将所有存储

假设我有两个名为DB1和DB2的数据库。在DB1中有一个名为Student的表,在DB2中有一个名为SP1的存储过程。在SP1中,我使用以下查询选择Student表的数据:

从DB1.dbo.Student中选择*

我有300多个存储过程进行了上述跨数据库通信。现在,我想将我的数据库从DB1更改为DB3,从数据和模式的角度来看,它与DB1相同。 为此,我还必须修改具有完全限定数据库名称的所有300个存储过程。现在,查询可能如下所示:

从DB3.dbo.Student中选择*

我现在不想将所有存储过程都更改为点DB3,也不想将在存储过程中编写的查询更改为动态SQL(我知道这可以通过创建动态SQL来实现)

如果我们运行DB1.dbo.Student,它是否可能重定向到DB3.dbo.Student。任何中间层或任何SQL设置


这对我会有很大的帮助。提前谢谢

我只需要使用SQL Server脚本生成器工具编写所有存储过程的脚本。然后对脚本执行查找替换,查找文本“DB1.dbo.”,并替换为“DB3.dbo.”

将来你可能想考虑使用同义词来引用外部表,然后只需要更新同义词而不是所有的过程。请参阅以下有关同义词的MSDN文章:

同义词的使用示例:

    USE [DB1]
    GO

    -- Create a synonym for table A located in DB2.
    CREATE SYNONYM [dbo].[External_TableA] FOR [DB2].[dbo].[TableA]
    GO

    -- Synonym is pointing to TableA in DB2 , select statement will return data from DB2 tabla A.
    SELECT  *
    FROM    [External_TableA]

    GO

    -- Point the Synonym to same table but on DB3
    DROP SYNONYM [dbo].[External_TableA]
    CREATE SYNONYM [dbo].[External_TableA] FOR [DB3].[dbo].[TableA]

    GO

    -- No update was needed on views or stored procedure.
    -- Synonym is pointing to TableA in DB3 , select statement will return data from DB3 tabla A.
    SELECT  *
    FROM    [External_TableA]
follow查询将生成所需的DROP和CREATE脚本,以将同义词从旧数据库重新映射到新数据库

    DECLARE @oldDB NVARCHAR(100) = 'DB2';
    DECLARE @newDB NVARCHAR(100) = 'DB3';

    SELECT   'DROP SYNONYM [dbo].[' + name + ']' AS [Drop Script]
            ,'CREATE SYNONYM [dbo].[' + name + '] FOR ' + REPLACE(base_object_name, @oldDB, @newDB) AS CreateScript
    FROM    sys.synonyms 
    ORDER BY name

最好使用关键字

使用[要访问的数据库名称] 要使用的查询和存储过程 去

乙二醇


如果数据库重命名的目的是迁移数据库,那么为什么不重命名数据库本身呢


e、 g.说把DB1重命名为DB1_old,然后把DB3重命名为DB1

谢谢你的回答Edmond。。我不想再做硬代码了。我需要一些方法来调用DB3,而不改变我的存储过程。遗憾的是,我所知道的将DB作为参数传递的唯一方法是将所有过程重新编写为动态sql,这将是一个更糟糕的维护噩梦。我仍然建议使用同义词。虽然不是动态的,但您可以更新同义词,而不会影响其他存储过程或视图。创建可以自动删除和重新创建同义词的代码也容易得多。我在原来的答案中添加了一个例子。这看起来是最简单的解决方案。
use [db1]
select *from yourTableName
exec yourStoredProcedure parm1,parm2,....
Go