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

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

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

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

喜欢的东西:

SELECT * FROM (EXEC MyProc) AS TEMP

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


当前回答

尝试将你的过程转换为一个内联函数,返回如下表:

CREATE FUNCTION MyProc()
RETURNS TABLE AS
RETURN (SELECT * FROM MyTable)

然后你可以称它为

SELECT * FROM MyProc()

您还可以选择向函数传递参数,如下所示:

CREATE FUNCTION FuncName (@para1 para1_type, @para2 para2_type , ... ) 

并称之为

SELECT * FROM FuncName ( @para1 , @para2 )

其他回答

您可以将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

为了简单起见并使其可重新运行,我使用了一个系统StoredProcedure "sp_readerrorlog"来获取数据:

-----USING Table Variable
DECLARE @tblVar TABLE (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(MAX),
   [Text] NVARCHAR(MAX)
)
INSERT INTO @tblVar Exec sp_readerrorlog
SELECT LogDate as DateOccured, ProcessInfo as pInfo, [Text] as Message FROM @tblVar



-----(OR): Using Temp Table
IF OBJECT_ID('tempdb..#temp') IS NOT NULL  DROP TABLE #temp;
CREATE TABLE #temp (
   LogDate DATETIME,
   ProcessInfo NVARCHAR(55),
   Text NVARCHAR(MAX)
)
INSERT INTO #temp EXEC sp_readerrorlog
SELECT * FROM #temp

你要么想要一个表值函数,要么将你的EXEC插入一个临时表:

INSERT INTO #tab EXEC MyProc

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

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

你可以

创建一个表变量来保存 从存储的proc和 然后 的输出 将proc存储到表变量中, 然后 使用table变量 就像你对其他人一样 表格

... sql……

Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params 
Select * from @T Where ...