【问题标题】:How to execute stored procedures and use their returned table within another procedure? [duplicate]如何执行存储过程并在另一个过程中使用它们返回的表? [复制]
【发布时间】:2025-12-22 00:00:14
【问题描述】:

在 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 JOINing it with other columns),并且该函数的结果也可以在另一个函数中使用(也可以加入这些函数)。

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

This poster suggested 将 SELECT 查询放入表值函数中,我这样做了,但我不明白这一行:

SELECT * INTO CustList FROM CustomersbyRegion(1)

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

【问题讨论】:

  • 感谢您的建议,但我很确定那里的解决方案都没有帮助我。当我尝试再次重用我的程序时,选定的答案会失败 - 创建两个级别的 EXEC,我发现它无法完成的艰难方法。我不能使用 OPENROWSET,因为那里有人评论说这不是正确的解决方案,而是“黑客”,最重要的是,我无法打开与数据库的连接,因为我在服务器上没有必要的权限。 .. 也许我应该在我的问题中包含该信息,但在发布时我无法知道这与它相关。

标签: sql-server ms-access


【解决方案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

【讨论】:

  • 1) 当我尝试使用#temptable INNER JOIN #temptable ON Product.ProductId = #temptable.ProductId 时,我在#temptable.ProductId 上得到Invalid column name 2) 这是部分答案,因为即使调用该函数会返回我仍然需要的表把它放在#tempTable 或变量@tempTable 中,这让我回到了1)中的问题
  • 示例 1 不起作用
【解决方案2】:

我相信,当您运行查询时,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

【讨论】: