web-dev-qa-db-ja.com

ビューでストアドプロシージャを呼び出す方法

ビューでデータを返すストアドプロシージャを呼び出すにはどうすればよいですか?これも可能ですか?

30
jinsungy

この構造は、SQL Serverでは許可されていません。インラインテーブル値関数は、パラメータ化されたビューとして実行できますが、このようにSPを呼び出すことはまだ許可されていません。

SPとインライン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
25
Cade Roux
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
18
Glen

ビューでストアドプロシージャを呼び出すことができました(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
5
user4785167

Sql Server 2005を使用している場合、テーブル値関数を使用できます。これらをテーブルと同様に扱いながら、これらを直接呼び出してパラメータを渡すことができます。

詳細については、 Table-Valued User-Defined Functions をご覧ください。

2
Macros

私が見つけた最も簡単な解決策は、SPから取得したデータからテーブルを作成することです。次に、そこからビューを作成します。

SPからデータを選択するときに、最後の手順でこれを挿入します。 SELECT * into table1 FROM #Temp

table1からselect *としてビューvw_view1を作成します

0
JKMburu

以下のようにビューをスクリプト化する必要があります。 基本的に、プロシージャの結果をテーブル変数または一時テーブルに書き込んでから、ビューに選択します。

編集-ストアドプロシージャをテーブル値関数に変更できる場合、一時テーブルを選択する手順がなくなります。

**編集2 **-提案したように、sprocをビューに読み込むことができないというコメントは正しいです。代わりに、他の投稿で説明されているように、procをテーブル値関数に変換し、そこから選択します。

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

混乱をおaびします

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

MyTableValueFunctionがパラメーターを受け入れない場合でも、その後に括弧を含める必要があることに注意してください。

... from dbo.MyTableValueFunction()

括弧がないと、「無効なオブジェクト名」エラーが表示されます。

0
Geoff