代码之家  ›  专栏  ›  技术社区  ›  John

mssql2000:将存储过程结果用作SQL中的表

  •  4
  • John  · 技术社区  · 17 年前

    假设我有一个“mystoredprocedure”,它接受一个id作为参数,并返回一个信息表。

    是否可以编写类似这样的SQL语句?

    SELECT
        MyColumn
    FROM
       Table-ify('myStoredProcedure ' + @MyId) AS [MyTable]
    

    我觉得这不是,但在我使用遗留代码和链接服务器表的情况下,这将非常有益。

    谢谢!

    4 回复  |  直到 12 年前
        1
  •  5
  •   StingyJack    17 年前

    您可以这样使用表值函数。

    Here 是一些技巧…

        2
  •  1
  •   no_one    17 年前

    不,除非您将存储过程更改为TVF,否则它不是(至少不是以任何正式或文档化的方式)。

    但是有很多方法可以做到。所有这些基本上都涉及到一个链接服务器并使用OpenQuery——例如,请参见 here .但是请注意,它是非常脆弱的,因为您需要对服务器的名称进行硬编码—因此,如果您有多个具有不同名称的SQL Server实例,则可能会出现问题。

        3
  •  1
  •   Cervo    17 年前

    下面是存储过程之间共享数据的方法的非常好的摘要 http://www.sommarskog.se/share_data.html .

    基本上这取决于你想做什么。最常见的方法是在调用存储过程并让它填充之前创建临时表,或者有一个永久表,存储过程将数据转储到该表中,该表中还包含进程ID。

    已经提到了表值函数,但是在创建与存储过程相反的函数时有许多限制,因此它们可能适合您,也可能不适合您。这个链接提供了一个很好的可用指南。

    SQL Server 2005和SQL Server 2008稍微更改了选项。SQL Server 2005+使使用XML更加容易。因此,XML可以作为输出变量传递,并且很容易使用XML函数节点和值“分解”到表中。我相信SQL 2008允许将表变量传递到存储过程中(尽管是只读的)。由于您引用了SQL 2000,2005+增强不适用于您,但为了完整性,我提到了它们。

    很可能您将使用表值函数,或者在调用存储过程并让它填充之前创建临时表。

        4
  •  1
  •   Kumar V    12 年前

    在处理项目时,我使用以下方法将xp readErrorLog(afaik,返回一个表)的结果插入提前创建的临时表中。

     INSERT INTO [tempdb].[dbo].[ErrorLogsTMP]
     EXEC master.dbo.xp_readerrorlog
    

    从临时表中,选择所需的列。