如何从存储过程中选择

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

CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END

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

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

喜欢的东西:

SELECT * FROM (EXEC MyProc) AS TEMP

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

1162365 次浏览

你要么想要表值函数,要么将你的EXEC插入到一个临时表中:

INSERT INTO #tab EXEC MyProc

你可以

  1. 创建一个表变量 从存储的proc和 然后李< / > 插入的输出 将proc存储到表变量中, 然后
  2. 使用table变量 就像你对其他人一样 李表…< / >

... sql……

Declare @T Table ([column definitions here])
Insert @T Exec storedProcname params
Select * from @T 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

可以使用用户定义函数视图来代替过程。

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

你可以用OPENROWSET欺骗一下:

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

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

你必须阅读< >强OPENROWSET < / >强< >强OPENQUERY < / >强

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

没有必要使用临时表。

这就是我的解

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

尝试将你的过程转换为一个内联函数,返回如下表:

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 )

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

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

然后需要在刚刚定义的表类型中插入存储过程的结果

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

最后,只需从表类型中选择即可

Select * from @MyTableType

使用OPENQUERY,并在执行之前设置SET FMTONLY OFF; SET NOCOUNT ON;

试试下面的示例代码:

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

如果你得到错误'服务器未配置数据访问', 使用:< / p >

EXEC sp_serveroption 'YourServer', 'DATA ACCESS', TRUE

例如,如果您的服务器名为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')

它的工作原理。

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