2011-03-14 68 views
1

所以我有一個SQL Server正在運行,並且我有兩個數據庫,第一個數據庫存儲第二個數據庫的名稱。在第一個數據庫中,我希望創建一個在第二個表修改數據的聲明中,沿着線的東西:如何基於不同數據庫中的值訪問數據庫? (TSQL)

(這是從第一個數據庫查詢)

select * from [select database_name from table1].table 

我一直在玩弄與系統。關鍵字試圖找出我是否可以做到這一點,但沒有運氣。任何幫助將不勝感激,謝謝。

+0

如果您發佈代碼,XML或數據示例,請在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以便對其進行精確格式化和語法突出顯示! – 2011-03-14 19:49:44

回答

1

您必須構建一個字符串並將其作爲動態SQL執行。請參閱:The Curse and Blessings of Dynamic SQL

declare @database_name sysname 

select @database_name = database_name from Table1 

declare @sql nvarchar(1000) 

set @sql = N'select * from ' + @database_name + N'.SchemaName.TableName' 

exec sp_executesql @sql 
+0

感謝您的參考!愛標題:) – 2011-03-14 19:51:50

0

你可以做到這一點只能通過執行這樣的動態查詢:

DECLARE @base varchar(30) 
SELECT @base = "yourOtherBase" 
EXECUTE ("select * from " + @base + "..table"); 
+0

感謝您的信息,這完美的工作! – 2011-03-14 19:54:16

0

的一種方法是建立一些動態SQL,沿着線:

DECLARE @Command varchar(1000) 

SELECT @Command = replace('select * from <TargetDB>.dbo.table', '<TargetDB>', tabel1.database_name) 
from table1 
where [your criteria here] 

EXECUTE (@Command) 

另一種方法是創建引用「目標」數據庫的視圖(或同義詞或鏈接的服務器定義),例如

DECLARE @Command varchar(1000) 

SELECT @Command = replace('CREATE VIEW SomeView AS select * from <TargetDB>.dbo.table', '<TargetDB>', tabel1.database_name) 
from table1 
where [your criteria here] 

EXECUTE (@Command) 

這將創建一個可以被永久(即非動態)代碼引用的視圖。如果目標數據庫頻繁更改,或者您擁有大量目標數據庫,則這種方法效果不佳。

但說實話,真正的答案是不,你不能輕易做到這一點,而且你應該盡力避免必須這樣做的情況。相信我,這可能是一個調試和維護的噩夢。

+0

@Joe是對的,如果你這樣去使用'sp_executeSQL'。 – 2011-03-14 19:53:13