2017-05-25 61 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