SQL Server – SELECT FROM存储过程

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

CREATE PROCEDURE MyProc AS BEGIN SELECT * FROM MyTable END 

我的实际过程稍微复杂一点,这就是为什么必须有一个存储过程。

可以通过调用这个过程来select输出吗?

就像是:

 SELECT * FROM (EXEC MyProc) AS TEMP 

我需要使用SELECT TOP XROW_NUMBER和一个额外的WHERE子句来页面我的数据,我真的不想传递这些值作为参数。

您可以使用用户定义的function或视图而不是过程。

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

你应该看看Erland Sommarskog这篇优秀的文章:

  • 如何在存储过程之间共享数据

它基本上列出了您的scheme的所有可用选项。

您可以

  1. 创build一个表variables来保存存储过程的结果集,然后
  2. 将存储的proc的输出插入到表variables中,然后
  3. 像任何其他表一样使用tablevariables

… SQL ….

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

您可能需要一个Table-Valued函数或将EXEC插入临时表中:

 INSERT INTO #tab EXEC MyProc 

你必须阅读关于OPENROWSETOPENQUERY

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

没有必要使用临时表。

这是我的解决scheme

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

您可以将sp的输出复制到temporaty表中。

 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 

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

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

然后,您需要将您的存储过程的结果插入到刚定义的表types中

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

最后只需从您的表格types中select

 Select * from @MyTableType 

你可以使用OPENROWSET作弊一点:

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

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

使用OPENQUERY和befor执行设置“SET FMTONLY OFF; 设置NOCOUNT ON;

试试这个示例代码:

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

这听起来像你可能只需要使用一个视图 。 视图允许将查询表示为表格,以便查询视图。

尝试将您的过程转换为一个内联函数,该函数返回一个表格,如下所示:

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

然后你可以称之为

 SELECT * FROM MyProc() 

您还可以select将parameter passing给函数,如下所示:

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

并呼吁

 SELECT * FROM FuncName ( @para1 , @para2 ) 

如果'数据访问'错误,

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

后,

 SELECT * FROM OPENQUERY(SQLSERVERNAME, 'EXEC DBNAME..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 @CMDreplace它来检查命令,然后尝试执行它! 这是为了确保所有正确数量的单引号是在正确的地方。 🙂

我希望能帮助别人。

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