SQL Server - SELECT FROM 存储过程
我有一个返回行的存储过程。
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
我的实际过程有点复杂,这就是为什么需要一个sproc。
是否可以通过调用这个程序来选择输出?
比如说
SELECT * FROM (EXEC MyProc) AS TEMP
我需要使用SELECT TOP X
,ROW_NUMBER
,和一个额外的WHERE
子句来分页我的数据,我并不希望把这些值作为参数传递。
312
15
你可以
创建一个表变量来保存 的结果集,然后 然后 2. 将存储过程的输出插入 的输出插入到表变量中。 然后 3. 使用该表变量 就像你使用任何其他 表...
... sql ....
你应该看看Erland Sommarskog的这篇优秀文章。
它基本上列出了你的方案的所有可用选项。
1:
您可以使用[用户自定义函数][1]或[视图][2]代替过程。
[1]: https://docs.microsoft.com/en-us/sql/relational-databases/user-defined-functions/user-defined-functions [2]: https://docs.microsoft.com/en-us/sql/relational-databases/views/views
一个过程可以返回多个结果集,每个结果集都有自己的模式。 它不适合在
SELECT
语句中使用。你要么想要一个表值函数,要么将你的EXEC插入到一个临时表。
您必须阅读OPENROWSET和OPENQUERY。
你需要声明一个表类型,这个表类型包含的列数与你的存储过程返回的列数相同。 表类型中的列的数据类型和存储过程返回的列的数据类型应该是相同的。
然后你需要将存储过程的结果插入到你刚才定义的表类型中去
最后只需从你的表类型中选择
不需要使用临时表。
这是我的解决方案
你可以将sp的输出复制到temporaty表中。
使用OPENQUERY并在执行前设置'SET FMTONLY OFF。 SET NOCOUNT ON;'。
试试这个示例代码。
试着将你的存储过程转换为一个内联函数,其返回的表格如下。
然后你可以把它称为
你也可以选择向函数传递参数,如下所示。
并将其称为
如果'DATA ACCESS'。 false,
之后。
它的工作原理。
你可以用OPENROWSET作弊一下。
当然,这样每次还是会运行整个SP。
为了简单起见,也为了让它可以重复运行,我使用了一个系统的StoredProcedure "sp_readerrorlog"。 来获取数据。
听起来你可能只需要使用一个视图。 视图允许将查询表示为一个表,因此它,即视图,可以被查询。
例如,如果你的服务器叫SERVERX,我是这样做的......
为了检查这个工作,我注释了
EXEC()
命令行,并将其替换为SELECT @CMD
,以便在尝试执行命令之前查看命令!这是为了确保所有正确的单引号数量。 这是为了确保所有正确的单引号数量都在正确的地方。 :-)希望能帮到别人。