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

CREATE PROCEDURE MyProc
AS
BEGIN
    SELECT * FROM MyTable
END

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

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

喜欢的东西:

SELECT * FROM (EXEC MyProc) AS TEMP

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


当前回答

使用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

听起来您可能只需要使用视图。视图允许将查询表示为表,以便可以查询视图。

你可以用OPENROWSET欺骗一下:

SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...

当然,这仍然会每次运行整个SP。

例如,如果您的服务器名为SERVERX,我就是这样做的……

EXEC sp_serveroption 'SERVERX', 'DATA ACCESS', TRUE;
DECLARE @CMD VARCHAR(1000);
DECLARE @StudentID CHAR(10);
SET @StudentID = 'STUDENT01';
SET @CMD = 'SELECT * FROM OPENQUERY([SERVERX], ''SET FMTONLY OFF; SET NOCOUNT ON; EXECUTE MYDATABASE.dbo.MYSTOREDPROC ' + @StudentID + ''') WHERE SOMEFIELD = SOMEVALUE';
EXEC (@CMD);

为了检查这是否有效,我注释掉了EXEC()命令行,并将其替换为SELECT @CMD,以便在尝试执行它之前检查该命令!这是为了确保所有正确数量的单引号都在正确的位置。: -)

我希望这能帮助到一些人。

如果'DATA ACCESS'为假,

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

之后,

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

它的工作原理。