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

Sri*_*ddi 4 sql-server

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

Eri*_*ikE 17

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

CREATE SYNONYM [schema.]name FOR [[[linkedserver.]database.]schema.]name
Run Code Online (Sandbox Code Playgroud)

然后,通过存储过程中的同义词引用该对象.

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

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

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


Raj*_*ore 10

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

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

SET @strSQL = 'SELECT * FROM ' + @DatabaseNameParameter + '.Schema.TableName'
Run Code Online (Sandbox Code Playgroud)

您可以使用if子句设置@DatabaseNameParameter您喜欢的DB.

执行语句以获得结果.

  • 请注意,这种方法存在很多局限性.例如,动态SQL的范围完全不同,因此它无权访问存储过程中的表变量,临时表等.此外,它存在很大的潜在安全问题.在使用此方法之前,您应该查看http://www.sommarskog.se/dynamic_sql.html. (6认同)