Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server存储过程中动态设置数据库名称?_Sql Server - Fatal编程技术网

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

Sql server 在SQL Server存储过程中动态设置数据库名称?,sql-server,Sql Server,如何在SQL Server存储过程中动态设置数据库名称?存储过程是特定于数据库的。如果您想动态地访问另一个数据库中的数据,那么必须创建动态SQL并执行它 Declare @strSQL VarChar (MAX) Declare @DatabaseNameParameter VarChar (100) = 'MyOtherDB' SET @strSQL = 'SELECT * FROM ' + @DatabaseNameParameter + '.Schema.TableName' 您可以使

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

存储过程是特定于数据库的。如果您想动态地访问另一个数据库中的数据,那么必须创建动态SQL并执行它

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

SET @strSQL = 'SELECT * FROM ' + @DatabaseNameParameter + '.Schema.TableName'
您可以使用if子句将
@databasename参数设置为您喜欢的DB

执行语句以获得结果。

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

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

SET @DatabaseNameParameter = 'MyOtherDB'

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

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

有时,使用同义词是一种很好的策略:

CREATE SYNONYM [schema.]name FOR [[[linkedserver.]database.]schema.]name
然后,在存储过程中通过同义词引用对象

更改同义词点的位置是动态SQL的问题,但是您的主存储过程可以完全不使用动态SQL。创建一个表来管理所有需要引用的对象,并创建一个存储过程来将所有所需的同义词切换到正确的上下文

此功能仅在SQL Server 2005及更高版本中可用


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

您的问题并不完全清楚。也许你应该在这个问题上多加一些细节。不过要注意,这种方法有很多局限性。例如,动态SQL位于完全不同的范围内,因此它无法访问存储过程中的表变量、临时表等。此外,它还有很大的潜在安全问题。您应该在使用此方法之前签出。是否可以仅为数据库名创建同义词?示例:我的数据库的名称是:MYDB_01。我可以为它创建同义词吗?不,这是不可能的。太糟糕了,嗯?嗯。总比没有好。至少不需要动态SQL。但是,每个对象(表、视图)必须单独定义。正确!因此,创建和更新同义词需要动态SQL,而不是引用或使用它们。