web-dev-qa-db-fra.com

Comment appeler une procédure stockée dans une vue?

Comment appeler une procédure stockée qui renvoie des données dans une vue? Est-ce seulement possible? 

27
jinsungy

Cette construction n'est pas autorisée dans SQL Server. Une fonction de table en ligne peut fonctionner comme une vue paramétrée, mais n'est toujours pas autorisée à appeler un SP comme ceci.

Voici quelques exemples d'utilisation d'un SP et d'un fichier TVF en ligne de manière interchangeable - vous constaterez que le fichier TVF est plus flexible (il s'agit en gros d'une vue) plutôt qu'une fonction. être plus réutilisable:

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
24
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
17
Glen

J'ai pu appeler une procédure stockée dans une vue (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

Dans la procédure stockée, nous devons définir:

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

Si vous utilisez SQL Server 2005, vous pouvez utiliser des fonctions à valeur de table. Vous pouvez les appeler directement et passer des paramètres tout en les traitant comme s'il s'agissait de tables.

Pour plus d'informations, consultez Fonctions définies par l'utilisateur comme telles

2
Macros

Vous auriez à script la vue comme ci-dessous. Vous écrivez essentiellement les résultats de votre proc dans une table var ou temp, puis vous sélectionnez dans la vue. 

Éditer - Si vous pouvez modifier votre procédure stockée en fonction de valeur de table, le choix d'une table temporaire disparaît.

** Edit 2 ** - Les commentaires sont corrects, un sproc ne peut pas être lu dans une vue comme je l'ai suggéré. Au lieu de cela, convertissez votre proc en une fonction table-value comme mentionné dans d'autres publications et sélectionnez l'une de ces options: 

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

Je m'excuse pour la confusion

1
Rob Allen

La solution la plus simple que j'ai peut-être trouvée consiste à créer une table à partir des données que vous obtenez du SP. Puis créez une vue à partir de cela:

Insérez-le à la dernière étape lorsque vous sélectionnez des données à partir du SP . SELECT * dans le tableau 1 DE #Temp

créer la vue vw_view1 en tant que sélection * de la table1 

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

Notez que même si votre MyTableValueFunction n’accepte aucun paramètre, vous devez tout de même inclure des parenthèses après,

... from dbo.MyTableValueFunction()

Sans les parenthèses, vous obtiendrez une erreur "Nom d'objet non valide".

0
Geoff