2012-03-02 63 views
10

我正在使用SQL Server 2008將表值參數傳遞到跨不同數據庫的存儲過程

如何傳遞表值參數存儲過程跨越不同的數據庫,但同一臺服務器?

我應該在兩個數據庫中創建相同的表類型嗎?

請根據問題舉例或鏈接。

感謝您的任何幫助。

+0

我不相信這是可能的 - 你不能引用表型來自另一個數據庫,甚至在兩個數據庫中都有相同的類型定義時,一種類型的值不能分配給另一個。 – 2012-03-02 10:55:26

+0

在這種情況下我有什麼選擇?使用XML類型? – hgulyan 2012-03-02 10:58:19

回答

11

在迴應此評論(如果我是正確的,並且使用數據庫之間的臺灣居民入境許可證是不可能的):

我在這種情況下,有什麼選擇呢?使用XML類型?

純粹的方法就是說,如果兩個數據庫都使用相同的數據,它們應該被合併到一個數據庫中。實用主義者意識到這並非總是可行的 - 但是既然你明顯可以改變調用者和被調用者,也許只需使用一個臨時表,這兩個存儲過程都知道。


我不相信這是可能的 - 你不能從其它數據庫中的表型,甚至與兩個數據塊相同的類型定義,一個類型的值不能分配到其他。


你不數據庫之間的臨時表。臨時表總是存儲在tempdb中,只要連接處於打開狀態且臨時表未被刪除,就可以訪問您的連接。

所以,你在調用者創建臨時表:

CREATE TABLE #Values (ID int not null,ColA varchar(10) not null) 
INSERT INTO #Values (ID,ColA) 
/* Whatever you do to populate the table */ 
EXEC OtherDB..OtherProc 

然後在被叫:

CREATE PROCEDURE OtherProc 
/* No parameter passed */ 
AS 
    SELECT * from #Values 
+0

以及如何在數據庫之間傳遞臨時表。你能舉一個例子嗎?謝謝。 – hgulyan 2012-03-02 11:11:23

+1

@hgulyan - 在我的答案底部添加了一個示例 - 您根本不通過它。 – 2012-03-02 11:25:25

+0

哇,不知道。謝謝。非常棒! – hgulyan 2012-03-02 11:26:23

1

表UDT只對同一個數據庫中的存儲過程有效。

所以,你必須在每臺服務器上創建類型,並在存儲的特效庫中引用它。只需在兩個DB http://msdn.microsoft.com/en-us/library/bb510489.aspx中運行此示例的第一部分即可。

如果您不需要效率,您可以隨時使用其他方法 - 即傳遞xml文檔參數或使用s.p.期望一個包含輸入數據的臨時表。

編輯:添加例如

create database Test1 
create database Test2 
go 
use Test1 
create type PersonalMessage as TABLE 
(Message varchar(50)) 
go 
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS 
    select * from @Message 
go 
use Test2 
create type PersonalMessage as TABLE 
(Message varchar(50)) 
go 
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS 
    select * from @Message 
go 
use Test1 
declare @mymsg PersonalMessage 
insert @mymsg select 'oh noes' 
exec InsertPersonalMessage @mymsg 
go 
use Test2 
declare @mymsg2 PersonalMessage 
insert @mymsg2 select 'oh noes' 
exec InsertPersonalMessage @mymsg2 

缺點是,有數據的兩個副本。 但是你可以同時對每個數據庫運行批處理。 這是否比使用表格有什麼更好的事實上都取決於你有什麼處理/數據大小 - 順便說一下,使用s.p.的臨時表。你只需從s.p中訪問它。代碼(如果不存在則失敗)。

+0

它不起作用。我有這個錯誤「操作數類型衝突:PersonalMessages與PersonalMessages不兼容」 – hgulyan 2012-03-02 10:58:59

+0

是的一個限制是,當您聲明表時,它使用綁定到當前數據庫上下文的數據類型。所以你必須這樣做:「使用db1」,創建表並調用proc,去,「使用db2」等等。你可以切換到臨時表傳遞給s.p.或填充一個全局臨時表,然後通過一個單獨的表變量爲每個數據庫傳遞。 – 2012-03-02 11:16:10

+0

但問題是在兩個數據庫之間使用表類型。 – hgulyan 2012-03-02 11:17:25

相關問題