如何在视图中调用存储过程?

时间:2009-05-27 16:41:23

标签: sql-server tsql database-design

如何调用在视图中返回数据的存储过程?这甚至可能吗?

7 个答案:

答案 0 :(得分:24)

SQL Server中不允许使用此结构。内联表值函数可以作为参数化视图执行,但仍然不允许像这样调用SP。

以下是交替使用SP和内联TVF的一些示例 - 您会看到TVF更灵活(它基本上更像是视图而不是功能),所以在可以使用内联TVF的情况下,它们可以是更可重复使用:

CREATE TABLE dbo.so916784 (
    num int
)
GO

INSERT INTO dbo.so916784 VALUES (0)
INSERT INTO dbo.so916784 VALUES (1)
INSERT INTO dbo.so916784 VALUES (2)
INSERT INTO dbo.so916784 VALUES (3)
INSERT INTO dbo.so916784 VALUES (4)
INSERT INTO dbo.so916784 VALUES (5)
INSERT INTO dbo.so916784 VALUES (6)
INSERT INTO dbo.so916784 VALUES (7)
INSERT INTO dbo.so916784 VALUES (8)
INSERT INTO dbo.so916784 VALUES (9)
GO

CREATE PROCEDURE dbo.usp_so916784 @mod AS int
AS 
BEGIN
    SELECT  *
    FROM    dbo.so916784
    WHERE   num % @mod = 0
END
GO

CREATE FUNCTION dbo.tvf_so916784 (@mod AS int)
RETURNS TABLE
    AS
RETURN
    (
     SELECT *
     FROM   dbo.so916784
     WHERE  num % @mod = 0
    )
GO    

EXEC dbo.usp_so916784 3
EXEC dbo.usp_so916784 4

SELECT * FROM dbo.tvf_so916784(3)    
SELECT * FROM dbo.tvf_so916784(4)

DROP FUNCTION dbo.tvf_so916784
DROP PROCEDURE dbo.usp_so916784
DROP TABLE dbo.so916784

答案 1 :(得分:17)

exec sp_addlinkedserver 
        @server = 'local',
        @srvproduct = '',
        @provider='SQLNCLI',
        @datasrc = @@SERVERNAME
go

create view ViewTest
as
select * from openquery(local, 'sp_who')
go

select * from ViewTest
go

答案 2 :(得分:5)

我能够在视图中调用存储过程(SQL Server 2005)。

CREATE FUNCTION [dbo].[dimMeasure] 
   RETURNS  TABLE  AS

    (
     SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost; Trusted_Connection=yes;', 'exec ceaw.dbo.sp_dimMeasure2')
    )
RETURN
GO

在内存存储过程中,我们需要设置:

set nocount on
SET FMTONLY OFF
CREATE VIEW [dbo].[dimMeasure]
AS

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'exec ceaw.dbo.sp_dimMeasure2')

GO

答案 3 :(得分:2)

如果您使用的是Sql Server 2005,则可以使用表值函数。您可以直接调用它们并传递参数,同时将它们视为表格。

有关详细信息,请查看Table-Valued User-Defined Functions

答案 4 :(得分:0)

您必须编写如下脚本的脚本。 您基本上将proc的结果写入表var或temp表,然后选择进入视图。

编辑 - 如果您可以将存储过程更改为表值函数,则会取消选择临时表的步骤。

**编辑2 ** - 注释是正确的,无法将sproc读入我建议的视图中。相反,将proc转换为其他帖子中提到的表值函数,并从中选择:

create view sampleView
as select field1, field2, ... 
from dbo.MyTableValueFunction

我为这种困惑道歉

答案 5 :(得分:0)

create view sampleView as 
select field1, field2, ... 
from dbo.MyTableValueFunction

请注意,即使您的MyTableValueFunction不接受任何参数,您仍需要在其后面加括括号,即:

... from dbo.MyTableValueFunction()

如果没有括号,您将收到“无效的对象名称”错误。

答案 6 :(得分:0)

我可能找到的最简单的解决方案是根据从SP获得的数据创建表。然后从中创建一个视图:

从SP中选择数据时,请在最后一步插入此文件。 从#Temp

选择*到table1

从表1中选择*创建视图vw_view1