2011-06-27 44 views
1

所以我有一個分貝中的sproc ..讓我們打電話給這個分區A。該數據庫在另一個數據庫中使用表(t1, t2)。讓我們打電話給db B運行一個存儲過程從一個不同的分區

好了,所以我現在把它叫做方法是:A.dbo.My_Proc,但我得到另一個錯誤:

Invalid object name 'dbo.t1'.

我這麼多努力,提供的參數。在我的Sproc中,select * from @dbname.dbo.t1 但是這會導致錯誤。我不能把存儲在db B中。

雖然硬編碼是足夠的(如果有辦法),db B每年都會更改,所以「提供」數據庫會很好。

我試過使用use B; go,但它給了我錯誤,說不能在一個存儲過程中。

+0

請問你跑'A.dbo.My_Proc'有權限的數據庫帳戶? –

+0

是的。我的意思是,目前這一切工作,如果我手動輸入。像'B.dbo.table1'從sproc ..但是我想'B'被提供。 – masfenix

回答

1

你可以創建一個同義詞:

編輯:我現在所需要的表,而不是PROC同義詞看到。讓他們切換。所以,你可以在數據庫B創建數據庫中的一個同義詞表:

USE A; 
CREATE SYNONYM dbo.t1 FOR B.dbo.t1; 

那麼你在過程中可以簡單地說:

SELECT * FROM dbo.t1; 

而無需手動提供數據庫名稱可言,查詢知道(基於近義詞)從表中獲取數據庫B.數據當數據庫B更改爲C,你可以簡單:

DROP SYNONYM dbo.t1; 
CREATE SYNONYM dbo.t1 FOR C.dbo.t1; 

如果使用「真正的」數據庫名稱在你的敘述中,與任意的A/B名稱相反,它可能會導致更容易的理解。只是一個建議。 :-)

/EDIT

另一種選擇是在數據庫名稱來傳遞,並經由動態SQL構造。例如。而不是SELECT * FROM @ dbname.dbo.t1(這不會有任何效果),你可以這樣做:

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM ' + QUOTENAME(@dbname) + '.dbo.t1;'; 
EXEC sp_executesql @sql; 

但是,如果這個其他數據庫名稱真的只有一年一次的變化,我建議同義詞路線比較好總體。

+0

爲同義詞+1 - 我打算提出動態SQL,但我認爲同義詞是一個更清潔解。 – JNK

+0

我不明白如何使用同義詞路由?你能舉一個更具體的例子嗎?謝謝! – masfenix

+0

注意將簡單的@dbname連接到執行的SQL中導致的SQL注入漏洞。 –

1

當您執行exec someDB.dbo.SomeProc時,執行上下文切換爲someDB。所以如果程序發出SELECT FROM dbo.t1那麼dbo.t1必須在someDB。如果你想程序從「提供」數據庫中選擇,則程序必須使用dynamic-SQL

create procedure someProc 
    @dbname sysname 
as 
begin 
... 
set @sql = N'SELECT ... FROM ' + quotename(@dbname) +N'.dbo.t1'; 
exec sp_executesql @sql; 
... 
end 
相關問題