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

Sql server 如何执行存储过程并在另一个过程中使用其返回的表?,sql-server,ms-access,Sql Server,Ms Access,在MS Access中,您可以使用表和选择查询执行以下操作 FROM Product INNER JOIN outputQry ON Product.ProductId = outputQry.ProductId 假设产品是一个表,并通过查询输出,那么如何在T-SQL中执行同样的操作 我编写了一个返回表的函数,如何在另一个函数/过程中执行它,以便将结果与一些表进行内部连接 我的函数如下所示 ALTER FUNCTION [dbo].[PreconfiguredConfigs_GetNoOfOu

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

FROM Product INNER JOIN outputQry ON Product.ProductId = outputQry.ProductId
假设产品是一个表,并通过查询输出,那么如何在T-SQL中执行同样的操作

我编写了一个返回表的函数,如何在另一个函数/过程中执行它,以便将结果与一些表进行内部连接

我的函数如下所示

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查询放在表值函数中,我确实这样做了,但我不理解这一行:

SELECT * INTO CustList FROM CustomersbyRegion(1)

什么是客户名单?是不是数据库中的一个表在调用函数时被覆盖?我想这将是一个解决方案,因为这样我就可以随心所欲地进行内部联接,并避免在使用变量和临时表时看到的所有无效列名错误。在我对

的评论中,您有两个选项:

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

我相信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

1当我尝试在Product.ProductId=tettable.ProductId上使用tettable-internal-JOIN-tettable时,我在tettable.ProductId上得到了无效的列名2,这是部分答案,因为即使调用该函数返回一个表,我仍然需要将其放在一个可试探的或变量@attreable中,这会让我回到1示例1中的问题,但我很确定没有任何解决方案可以帮助我。当我再次尝试重用我的过程时,选择的答案失败了——创建两个级别的EXEC,我发现这是很难做到的。我不能使用OPENROWSET,因为有人评论说这不是一个正确的解决方案,而是一个“黑客”,而且我不能打开到数据库的连接,因为我在服务器上没有必要的权限。。。也许我应该在我的问题中包括这些信息,但在发帖的时候我没有办法知道这些信息是否与之相关。