2013-01-18 139 views
1

代碼用戶定義的表類型參數

CREATE TYPE [dbo].[IntListType] AS TABLE([Number] [int] NULL) 
DECLARE @ids as IntListType; 
DECLARE @TempIds as IntListType;  

形勢

我有這需要在存儲過程中被過濾的產品很長的名單。該過濾器以用戶定義的表格類型提供,每個過濾器可以爲空或全部。我試圖爲此創建一個查詢,但如果其中一個過濾器爲空,它將不起作用。

所以我決定創建另一個用戶自定義表格類型,它只包含列:Number。

然後,對於每個過濾器類型,將請檢查是否是空 IF (select filterName from @customtable) is not null 如果是這樣,它會查詢產品標識的相匹配的名字,其並將其添加到號碼列表。

如果下一個過濾器不是空的,它會將該ID添加到臨時表中,該臨時表又將與第一個表結合。

到目前爲止,我發現這是處理過濾器是否爲空的最有效方法。無論如何,它會得到我需要的ID!現在

,每一個過濾器最終將藉此在下面的代碼:

IF (select count(*) from @ids) > 0 
BEGIN    
    IF(select count(*) from @TempIds) 
    BEGIN 
    delete from @ids 
     where Number not in 
      (select C.Number 
      from @ids C 
      inner join @TempIds T on C.Number = T.Number)  
    END 
END 
ELSE 
BEGIN 
    insert into @ids 
    select * from @TempIds 
END 
delete from @TempIds 

問題

我正在尋找一種方式來實現最後命名代碼到存儲過程中這使我回IntListType的列表。然而,我每次執行的@ids(declare @ids as IntListType) can't be set. (asin set @ids = @TempIds'>會抱怨'必須聲明標量變量@ids'以及'@TempIds')

我該如何解決這個問題?

嘗試

我已經嘗試過的所有的每個表結合了內部聯接,外連接和其他連接..但絕不是我會得到相同的結果時,任何(或全部跳過此)的過濾器是空的。

據我所見,這是有效提高每種過濾器類型的唯一方法,如果不是,則檢查它們是否爲空;處理結果等等

回答

0

在你分享的部分查詢中,沒有@ids或@TempIds的聲明。 你可以添加該部分?

除此之外,我想你不應該尋找一個用戶定義類型:Can T-SQL function return user-defined table type?

看一看用戶定義的函數:

+0

添加的額外代碼 –

+0

我沒有看到一個函數如何返回一個列表,之後是相同的列表可以通過函數再次改變。 –

相關問題