SQL Server – SELECT FROM存储过程
我有一个存储过程返回行:
CREATE PROCEDURE MyProc AS BEGIN SELECT * FROM MyTable END
我的实际过程稍微复杂一点,这就是为什么必须有一个存储过程。
可以通过调用这个过程来select输出吗?
就像是:
SELECT * FROM (EXEC MyProc) AS TEMP
我需要使用SELECT TOP X
, ROW_NUMBER
和一个额外的WHERE
子句来页面我的数据,我真的不想传递这些值作为参数。
您可以使用用户定义的function或视图而不是过程。
过程可以返回多个结果集,每个结果集都有自己的模式。 它不适合在SELECT
语句中使用。
你应该看看Erland Sommarskog这篇优秀的文章:
- 如何在存储过程之间共享数据
它基本上列出了您的scheme的所有可用选项。
您可以
- 创build一个表variables来保存存储过程的结果集,然后
- 将存储的proc的输出插入到表variables中,然后
- 像任何其他表一样使用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
你必须阅读关于OPENROWSET和OPENQUERY
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 @CMD
replace它来检查命令,然后尝试执行它! 这是为了确保所有正确数量的单引号是在正确的地方。 🙂
我希望能帮助别人。
为了简单起见,为了使其可以重新运行,我使用了一个系统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