我有一个存储过程,返回行:

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

我的实际过程稍微复杂一些,这就是为什么需要存储过程。

是否可以通过调用此过程来选择输出?

喜欢的东西:

SELECT * FROM (EXEC MyProc) AS TEMP

我需要使用SELECT TOP X、ROW_NUMBER和一个附加的WHERE子句来分页我的数据,我并不想将这些值作为参数传递。


当前回答

您需要声明一个包含与存储过程返回的列相同数量的表类型。表类型中列的数据类型和过程返回的列的数据类型应该相同

declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)  

然后需要在刚刚定义的表类型中插入存储过程的结果

Insert into @MyTableType 
EXEC [dbo].[MyStoredProcedure]

最后,只需从表类型中选择即可

Select * from @MyTableType

其他回答

可以使用用户定义函数或视图来代替过程。

一个过程可以返回多个结果集,每个结果集都有自己的模式。不适合在SELECT语句中使用。

没有必要使用临时表。

这就是我的解

SELECT  *  FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue

使用OPENQUERY,然后执行set FMTONLY OFF;设置nocount on;

试试下面的示例代码:

SELECT top(1)*
FROM
OPENQUERY( [Server], 'SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE  [database].[dbo].[storedprocedure]  value,value ')

如果你得到错误“服务器未配置数据访问”, 用这个:

EXEC sp_serveroption 'YourServer', 'DATA ACCESS', TRUE

您可以将sp的输出复制到临时表。

CREATE TABLE #GetVersionValues
(
    [Index] int,
    [Name]  sysname,
    Internal_value  int,
    Character_Value sysname
)
INSERT #GetVersionValues EXEC master.dbo.xp_msver 'WindowsVersion'
SELECT * FROM #GetVersionValues
drop TABLE #GetVersionValues

您需要声明一个包含与存储过程返回的列相同数量的表类型。表类型中列的数据类型和过程返回的列的数据类型应该相同

declare @MyTableType as table
(
FIRSTCOLUMN int
,.....
)  

然后需要在刚刚定义的表类型中插入存储过程的结果

Insert into @MyTableType 
EXEC [dbo].[MyStoredProcedure]

最后,只需从表类型中选择即可

Select * from @MyTableType