MSSQL2000:使用存储过程结果作为sql中的表

时间:2009-01-16 19:38:01

标签: stored-procedures sql-server-2000

假设我有'myStoredProcedure',它将Id作为参数,并返回一个信息表。

是否可以编写与此类似的SQL语句?

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

我觉得它不是,但在我使用遗留代码的场景中它会非常有用。链接服务器表

谢谢!

4 个答案:

答案 0 :(得分:5)

您可以通过这种方式使用表值函数。

Here是一些技巧......

答案 1 :(得分:1)

不,不是 - 至少不是以任何官方或文件方式 - 除非您将存储过程更改为TVF。

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

答案 2 :(得分:1)

以下是存储过程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 +增强功能不适用于您,但我提到它们是为了完整性。

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

答案 3 :(得分:1)

在处理项目时,我使用以下内容将xp_readerrorlog(afaik,返回表)的结果插入到提前创建的临时表中。

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

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