2011-11-23 117 views
1

您可以在SQL Server從T-SQL函數返回一個表2008在SQL Server返回多個表從T-SQL函數2008

我想知道是否有可能返回多個表。

這種情況是我有三個查詢過濾3個不同的表。每個表格都會根據我想從函數返回的5個過濾表格進行過濾;而不是在每個查詢中複製並粘貼其創建。

的是什麼,這將看起來像複製和粘貼一個簡單的例子:

FUNCTION GetValuesA(@SomeParameter int) RETURNS @ids TABLE (ID int) AS 

    WITH Filter1 As (Select id FROM FilterTable1 WHERE Attribute=SomeParameter) 
    , Filter2 As (Select id FROM FilterTable2 WHERE Attribute=SomeParameter) 

    INSERT INTO @IDs 
    SELECT ID FROM ValueTableA 
    WHERE ColA IN (SELECT id FROM Filter1) 
    AND ColB IN (SELECT id FROM Filter2) 

    RETURN 

----------------------------------------------------------------------------- 

FUNCTION GetValuesB(@SomeParameter int) RETURNS @ids TABLE (ID int) AS 

    WITH Filter1 As (Select id FROM FilterTable1 WHERE Attribute=SomeParameter) 
    , Filter2 As (Select id FROM FilterTable2 WHERE Attribute=SomeParameter) 

    INSERT INTO @IDs 
    SELECT ID FROM ValueTableB 
    WHERE ColA IN (SELECT id FROM Filter1) 
    AND ColB IN (SELECT id FROM Filter2) 
    AND ColC IN (SELECT id FROM Filter2) 

    RETURN 

所以,這兩個查詢之間的唯一區別是被過濾的表,如何(Where子句)。

我想知道我是否可以從函數返回Filter1 & Filter2。我也樂於提出解決這個問題的不同方法。

+0

您不能從同一過程返回兩個不同的結果集。如果你要處理結果,那麼兩個查詢都要考慮UNION,INTERSECT或MINUS。 –

回答

5

從概念上講,你會怎麼想到來處理返回的變量數表的功能?你會同時在兩張桌子上JOIN?如果返回的字段不排隊呢?

是否有某些原因導致每個過濾器都無法使用TVF?

+0

從概念上講,我想我會希望能夠在結果中爲每個表建立索引。 @Results [0],@Results [1],@Results [2]。雖然......這在TSQL中並不存在,所以這是一種洗滌。然而,像你提到的每個過濾器都有TVF可能是最合適的解決方案。謝謝! –

+1

@SheldonWarkentin - 通過索引引用意味着您將有多次列出的功能。對我而言,這意味着你將不止一次運行它,這是另一個問題。 – JNK

3

正如別人所說,沒有。 TSQL中的函數必須返回一個結果(儘管該結果可能以具有多個值的表的形式出現)。

有幾種方法可以實現類似的效果。一個存儲過程可以執行多個select語句,並將結果傳遞給稱爲它的任何東西,無論是應用層還是類似SSMS的東西。許多庫需要你添加額外的命令來訪問更多的結果集。例如,在Pyodbc訪問第一個結果集後,您需要調用cursor.nextset()

另外,在一個函數內部,您可以將幾個結果集合在一起,但這需要每個結果集具有相同的列。如果他們有不同的列結構,一種方法是爲每個select語句的缺失列添加空值。如果您需要知道哪個select語句返回了該值,則還可以添加一個表示該值的列。這應該適用於你簡化的例子,因爲在每種情況下,它只是返回一個ID列,但如果列名或類型完全不同,它可能會很快變得非常快。

相關問題