2011-11-23 69 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列,但如果列名或类型完全不同,它可能会很快变得非常快。

相关问题