如何在SQL Server存储过程中动态设置数据库名称?
答案 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