2012-10-04 132 views
1

我習慣於這樣做:系統存儲過程和表參數

use MyDb 
go 
create type table_list as table (name sysname) 
go 
create proc rebuild_indexes 
    @ls table_list readonly 
as 
    [...] 

但現在我想在創建proc和其他數據庫中使用它:

use master 
go 
create type table_list as table (name sysname) 
go 
create proc sp_rebuild_indexes 
    @ls table_list readonly 
as 
    [...] 

...它建立得很好,但我無法使用它!

use MyDb 
go 
declare @ls table_list 

產量:

消息2715,級別16,狀態3,行1列,參數或變量#1: 找不到數據類型table_list。參數或變量'@'具有無效數據類型 。

所以我試圖創建一個代名詞,其創建過程中不抱怨,但沒有幫助:

create synonym table_list for master.dbo.table_list 

想法的人?

+0

您是否嘗試將數據類型稱爲'master..table_list'? – Vikdor

+0

@Vikdor,我做了,但沒有編譯 – ekkis

回答

1

據我所知,用戶定義類型不能在他們創建的數據庫的上下文之外使用。

您可能必須創建每個數據庫中的UDT,但保留在存儲過程高手。

您是否有使用sp_命名約定的特定原因?

在不同的數據庫中聲明皮特

+2

即使您在兩個數據庫中聲明瞭兩個結構相同的表類型,並且名稱相同,也無法將一個數據庫的實例從一個數據庫傳遞到另一個數據庫。 –

+0

我不確定這是否意味着同樣的事情......「如果相同的用戶定義類型已註冊並且可以在兩個數據庫中訪問,則可以將用戶定義的類型值從一個數據庫轉換爲用於其他數據庫「http://msdn.microsoft.com/en-us/library/ms178069(v=sql.105).aspx – RubbaChikin

+0

我只能找到引用關於CLR UDT的頁面,而不是表格類型。 –

2

表類型,即使它們共享相同的名稱和結構,不被視爲由SQL Server是相同的:

create database DB1 
go 
use DB1 
go 
create type TT1 as table (ID int not null) 
go 
create procedure Echo 
    @T TT1 readonly 
as 
    select * from @T 
go 
create database DB2 
go 
use DB2 
go 
create type TT1 as table (ID int not null) 
go 
declare @T TT1 
insert into @T(ID) values (1) 
exec DB1..Echo @T 

結果:

(1 row(s) affected) 
Msg 206, Level 16, State 2, Procedure Echo, Line 0 
Operand type clash: TT1 is incompatible with TT1 

據我所知,沒有辦法使用另一個數據庫中的表類型定義在數據庫中聲明變量。 (例如在此可以看到,可以使用一個用戶定義的表型,它只能被命名爲<table type><schema>.<table type> 3或4部分的名稱是不允許的任何地方。)

(以上爲真2008和2012;很明顯,未來版本可能會做一些事情來解決這個問題)


作爲變通,你可以做的「窮人的」方式 - 有你的主定義的存儲過程的工作對一個臨時表,而不是用戶定義的表類型:

use Master 
go 
create procedure sp_Echo 
as 
    select DB_NAME(),* from #t 
go 
create database DB1 
go 
use DB1 
go 
create table #t (ID int not null) 
insert into #t (ID) values (1),(2) 
exec sp_Echo 

結果:

------------- ----------- 
DB1   1 
DB1   2 
+0

+1 - 是的,我想也可以傳遞一個XML對象。可悲的是,同義詞不起作用......同義詞的全部意義在於,您可以引用外來物似乎是本地的。好吧。 – ekkis