我有一个存储过程,返回行:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
我的实际过程稍微复杂一些,这就是为什么需要存储过程。
是否可以通过调用此过程来选择输出?
喜欢的东西:
SELECT * FROM (EXEC MyProc) AS TEMP
我需要使用SELECT TOP X、ROW_NUMBER和一个附加的WHERE子句来分页我的数据,我并不想将这些值作为参数传递。
我有一个存储过程,返回行:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
我的实际过程稍微复杂一些,这就是为什么需要存储过程。
是否可以通过调用此过程来选择输出?
喜欢的东西:
SELECT * FROM (EXEC MyProc) AS TEMP
我需要使用SELECT TOP X、ROW_NUMBER和一个附加的WHERE子句来分页我的数据,我并不想将这些值作为参数传递。
当前回答
没有必要使用临时表。
这就是我的解
SELECT * FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
WHERE somefield = anyvalue
其他回答
你必须了解OPENROWSET和OPENQUERY
SELECT *
INTO #tmp FROM
OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
例如,如果您的服务器名为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')
它的工作原理。
你可以用OPENROWSET欺骗一下:
SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...
当然,这仍然会每次运行整个SP。
尝试将你的过程转换为一个内联函数,返回如下表:
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 )