¿Cómo llamar a un procedimiento almacenado en una vista?


¿Cómo llamaría a un Procedimiento almacenado que devuelve datos en una vista? ¿Es esto posible?

Author: Cade Roux, 2009-05-27

6 answers

Esta construcción no está permitida en SQL Server. Una función con valor de tabla en línea puede funcionar como una vista parametrizada, pero todavía no se le permite llamar a un SP como este.

Aquí hay algunos ejemplos de usar un SP y un TVF inline indistintamente-verás que el TVF es más flexible (básicamente se parece más a una vista que a una función), por lo que donde se puede usar un TVF inline, pueden ser más re-eusable:

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
 21
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 18:30:15
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
 16
Author: Glen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-22 11:07:43

Pude llamar al procedimiento almacenado en una vista (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

Dentro del procedimiento almacenado necesitamos establecer:

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
 4
Author: user4785167,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-14 01:02:06

Si está utilizando Sql Server 2005 puede utilizar funciones con valores de tabla. Usted puede llamar a estos directamente y pasar parámetros, mientras que tratarlos como si fueran tablas.

Para obtener más información, consulte Funciones Definidas por el Usuario con valores de tabla

 2
Author: Macros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 22:59:54

Tendría que escribir la vista como a continuación. Esencialmente escribiría los resultados de su proc en una tabla var o tabla temp, luego seleccionaría en la vista.

Editar - Si puede cambiar su procedimiento almacenado a una función de Valor de tabla, eliminaría el paso de seleccionar a una tabla temporal.

**Edit 2 ** - Los comentarios son correctos de que un sproc no se puede leer en una vista como sugerí. En su lugar, convierta su proc a una función de valor de tabla como se mencionó en otros mensajes y seleccione de que:

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

Me disculpo por la confusión

 1
Author: Rob Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-27 18:41:26
create view sampleView as 
select field1, field2, ... 
from dbo.MyTableValueFunction

Tenga en cuenta que incluso si su función Mytablevaluuefunction no acepta ningún parámetro, aún debe incluir paréntesis después de él, es decir:

... from dbo.MyTableValueFunction()

Sin los paréntesis, obtendrá un error de "Nombre de objeto no válido".

 0
Author: Romesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-05 09:16:15