假设我有'myStoredProcedure',它将Id作为参数,并返回一个信息表。
是否可以编写与此类似的SQL语句?
SELECT
MyColumn
FROM
Table-ify('myStoredProcedure ' + @MyId) AS [MyTable]
我觉得它不是,但在我使用遗留代码的场景中它会非常有用。链接服务器表
谢谢!
答案 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
从临时表中选择所需的列。