我有一个存储过程,返回行:
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子句来分页我的数据,我并不想将这些值作为参数传递。
当前回答
您可以将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
其他回答
您可以将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
你要么想要一个表值函数,要么将你的EXEC插入一个临时表:
INSERT INTO #tab EXEC MyProc
你可以用OPENROWSET欺骗一下:
SELECT ...fieldlist...
FROM OPENROWSET('SQLNCLI', 'connection string', 'name of sp')
WHERE ...
当然,这仍然会每次运行整个SP。
为了简单起见并使其可重新运行,我使用了一个系统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
使用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