Comment appeler une procédure stockée qui renvoie des données dans une vue? Est-ce seulement possible?
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
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
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
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
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
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
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".