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

时间:2014-04-29 15:32:57

标签: sql-server ms-access

在MS Access中,您可以使用表和SELECT查询

执行以下操作
FROM Product INNER JOIN outputQry ON Product.ProductId = outputQry.ProductId

假设Product是一个表而outputQry是一个查询,如何在T-SQL中做同样的事情?

我编写了一个返回表的函数,如何在另一个函数/过程中执行它,以便我可以(例如)INNER JOIN与一些表的结果?

我的功能看起来像这样

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

编辑:一个额外的要求是我可以“链接”这些函数,因此上面写的一个结果可以用在另一个函数中(INNER将它与其他列连接),以及函数结果也可以用在另一个函数中(也可以加入这些函数)。

甚至可以完成,还是我必须彻底改变我的设计?要求来自数据库在Access中的设计方式。

This poster suggested将SELECT查询放在table-value函数中,我做了,但我不理解这一行:

SELECT * INTO CustList FROM CustomersbyRegion(1)

什么是CustList?数据库中的表是否会在调用函数时被覆盖?我想这将是一个解决方案,因为那时我可以INNER JOIN它我想要的所有并避免我在使用变量和临时表时看到的所有Invalid column name错误(更多关于我对{{3的评论中的错误) }})

2 个答案:

答案 0 :(得分:2)

您有几个选择:

1)将您的存储过程执行到临时表中,然后与临时表

连接
CREATE TABLE #tempTable
(
   COL1 INT,
   COL2 INT   
)

INSERT INTO #tempTable 
Exec myStoredProcedure

2)创建一个用户定义的函数,该函数返回一个表并加入该表。

CREATE FUNCTION output
(  

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

答案 1 :(得分:1)

我相信Access在运行查询时所做的就是创建一个“视图”,这就是你可以加入它的原因。在SQL Server视图中以相同的方式起作用(对基表的任何更改在调用时都在视图中表示)。

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

然后你可以加入到这个:

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