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

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

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

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

喜欢的东西:

SELECT * FROM (EXEC MyProc) AS TEMP

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


当前回答

如果'DATA ACCESS'为假,

EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE

之后,

SELECT  *  FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')

它的工作原理。

其他回答

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

INSERT INTO #tab EXEC MyProc

你必须了解OPENROWSET和OPENQUERY

SELECT  * 
INTO    #tmp FROM    
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')

为了简单起见并使其可重新运行,我使用了一个系统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

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

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

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

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

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

Select * from @MyTableType

如果'DATA ACCESS'为假,

EXEC sp_serveroption 'SQLSERVERNAME', 'DATA ACCESS', TRUE

之后,

SELECT  *  FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..MyProc @parameters')

它的工作原理。