2017-05-25 34 views
0

4个数据库,全部在同一实例中,具有相同的表结构。TSQL动态数据库引用

我在“通用”数据库中没有引用特定数据库并使用DB_NAME()的复杂视图。

我试图从其他数据库运行一个新视图,只是在引用其自己的数据库中的数据的公共数据库中从该视图执行SELECT *

我的问题是其他数据库的视图保持公用数据库为当前的DB_NAME()

有没有办法解决这个问题?

我的目标是只保留TSQL代码的一个副本,我可以从一个公共位置的所有数据库运行TSQL代码,但访问特定于它所运行的数据库的数据,并使用“常见”数据库中的视图作为模板。

+1

创建[SYNONYMS](https://docs.microsoft.com/en-us/sql/relational-databases/synonyms/create-synonyms)关于 “次要” 数据库referecing从“共同的观点“数据库。 –

+0

['Original_DB_Name()'](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/original-db-name-transact-sql)可能会有帮助,具体取决于您如何处理数据库连接。 – HABO

回答

0

如果您希望查看跨同一服务器并行共享的作用域公用表,可以执行三部分命名(db)。(schema)。(TableName)并执行联合。或者你可以做sp_MSforeachdb的黑色艺术。

假设我有两张表,分别在数据库Tester和Tester2上具有相同的确切结构。它们仅仅是具有PersonId,FirstName,LastName和CountryID的表。我真正想看到的是跨越数据库的人,但我想获得我从中获得的对dbname()的引用。

USE master 
GO 

Select 
    'Tester' AS Environment 
, FirstName 
, LastName 
from Tester.dbo.tePerson 
union 
Select 
    'Tester2' 
, FirstName 
, LastName 
from Tester2.dbo.tePerson 

--As far as I know MS warns against the all powerfull sp_MSforeachdb so you use this with knowing that some day MS may blow it up. 
DECLARE @Storage table (DbName varchar(64), FirstName VARCHAR(128), LastName VARCHAR(128)) 

INSERT INTO @Storage 
--Essentially this code says use tokenized database[?] only for names I specify like Tester and on this table run this recursive over the table I tell you. 
EXECUTE master.sys.sp_MSforeachdb 'USE [?]; if db_name() like ''%Tester%'' Select db_name(), FirstName, LastName From dbo.tePerson' 

Select * 
From @Storage 
1

如果您可以使用存储过程而不是视图,则可以使用类似这样的方法。

create procedure dbswitcher 
@whatDB as varchar(5) 
as 
begin 

    /* 
     EXECUTION EXAMPLE 
     exec dbswitcher 'DB3' 
    */ 
    if @whatDB = 'DB1' 
     begin 
      select * from DB1..TableA 
     end 
    if @whatDB = 'DB2' 
     begin 
      select * from DB2..TableA 
     end 
    if @whatDB = 'DB3' 
     begin 
      select * from DB3..TableA 
     end 
    if @whatDB = 'DB4' 
     begin 
      select * from DB4..TableA 
     end 
end