在SQL Server存储过程中动态设置数据库名称?

时间:2010-01-15 17:30:35

标签: sql-server

如何在SQL Server存储过程中动态设置数据库名称?

3 个答案:

答案 0 :(得分:15)

有时候,使用SYNONYM是一个很好的策略:

CREATE SYNONYM [schema.]name FOR [[[linkedserver.]database.]schema.]name

然后,在存储过程中通过其同义词引用该对象。

改变同义词指向的地方是动态SQL的问题,但是你的主存储过程可以完全不受动态SQL的影响。创建一个表来管理您需要引用的所有对象,以及一个将所有需要的同义词切换到正确上下文的存储过程。

此功能仅适用于SQL Server 2005及更高版本。

此方法不适用于频繁切换或不同连接需要使用不同数据库的情况。我将它用于偶尔在服务器之间移动的数据库(它可以在prod数据库或复制数据库中运行,并且它们具有不同的名称)。在将数据库恢复到新家之后,我在其上运行了switchheroo SP,一切都在大约8秒内完成。

答案 1 :(得分:10)

存储过程是特定于数据库的。如果要动态访问其他数据库中的数据,则必须创建动态SQL并执行它。

Declare @strSQL VarChar (MAX)
Declare @DatabaseNameParameter VarChar (100) = 'MyOtherDB'

SET @strSQL = 'SELECT * FROM ' + @DatabaseNameParameter + '.Schema.TableName'

您可以使用if子句将@DatabaseNameParameter设置为您喜欢的数据库。

执行该语句以获得结果。

答案 2 :(得分:3)

这是动态SQL,适用于存储过程

Declare @ThreePartName varchar (1000)
Declare @DatabaseNameParameter varchar (100)

SET @DatabaseNameParameter = 'MyOtherDB'

SET @ThreePartName = @DatabaseNameParameter + '.Schema.MyOtherSP'

EXEC @ThreePartName @p1, @p2...   --Look! No brackets