关于sql server:如何执行存储过程并在另一个过程中使用它们返回的表?

How to execute stored procedures and use their returned table within another procedure?

本问题已经有最佳答案,请猛点这里访问。

在MS Access中,您可以使用两个表和选择查询执行以下操作

1
FROM Product INNER JOIN outputQry ON Product.ProductId = outputQry.ProductId

假设产品是一个表,而输出是一个查询,那么在T-SQL中如何做到这一点呢?

我编写了一个返回表的函数,如何在另一个函数/过程中执行它,以便(例如)使用一些表对结果进行内部联接?

我的功能是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ALTER FUNCTION [dbo].[PreconfiguredConfigs_GetNoOfOutputs]()
RETURNS @outputTable TABLE
    (
         ProductId int,
     NumberOfOutputs int
    )
AS
BEGIN
DECLARE @table TABLE
    (
        ProductId int,
        NumberOfOutputs int
    )
    INSERT INTO @table
    SELECT Outputs.ProductId, Count(Outputs.ProductId) AS NumberOfOutputs
    FROM [dbo.PreconfiguredConfigs].[Outputs]
    GROUP BY Outputs.ProductId;
    INSERT INTO @outputTable
    SELECT ProductId, NumberOfOutputs FROM @table
    RETURN
END

编辑:另外一个要求是我可以"链接"函数,所以上面写的一个结果可以用于另一个函数(内部将其与其他列连接),并且该函数结果也可以用于另一个函数(也连接这些函数)。

甚至可以这样做,还是我必须彻底改变我的设计?这些需求来自于在Access中设计数据库的方式。

此海报建议将select查询放入table-value函数中,这是我做的,但我不理解此行:

1
SELECT * INTO CustList FROM CustomersbyRegion(1)

什么是客户名单?它是否是数据库中的一个表,每当调用函数时都会被覆盖?我想这是一个解决方案,因为这样我就可以随心所欲地进行内部连接,并避免在使用变量和临时表时看到的所有Invalid column name错误(在我对rick s的评论中对此有更多的说明)。


您有几个选择:

1)将存储过程执行到临时表中,然后与临时表联接。

1
2
3
4
5
6
7
8
CREATE TABLE #tempTable
(
   COL1 INT,
   COL2 INT  
)

INSERT INTO #tempTable
Exec myStoredProcedure

2)创建一个用户定义的函数,该函数返回一个表并在此基础上联接。

1
2
3
4
5
6
7
8
9
10
11
CREATE FUNCTION output
(  

)
RETURNS TABLE
AS
RETURN
  SELECT Outputs.ProductId, Count(Outputs.ProductId) AS NumberOfOutputs
  FROM [dbo.PreconfiguredConfigs].[Outputs]
  GROUP BY Outputs.ProductId
GO


我相信,当您运行一个查询时,access所做的就是创建一个"视图",这就是为什么您可以加入它。在SQL Server视图中,操作方式相同(对基表的任何更改在调用基表时都表示在视图中)。

1
2
3
4
5
create view output_vw
as
SELECT Outputs.ProductId, Count(Outputs.ProductId) AS NumberOfOutputs
FROM [dbo.PreconfiguredConfigs].[Outputs]
GROUP BY Outputs.ProductId

然后您可以加入:

1
FROM Product INNER JOIN output_vw ON Product.ProductId = output_vw.ProductId