2009-05-27 259 views

Respuesta

20

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

Aquí hay algunos ejemplos del uso de un SP y un TVF en línea indistintamente: verá que el TVF es más flexible (es más como una vista que como una función), de modo que cuando se puede usar un TVF en línea, 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 
1

Debería guiar la Vista como a continuación. Básicamente, escribiría los resultados de su proceso en una mesa var o tabla temporal, 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 una tabla temporal.

** Editar 2 ** - Los comentarios son correctos que un sproc no se puede leer en una vista como sugerí. En su lugar, convertir su proc para una función de tabla de valores como se ha mencionado en otros puestos y seleccionar de que:

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

Me disculpo por la confusión

+0

Estoy bastante seguro de que no se puede hacer esto en SQL Server. –

+0

En realidad, estoy seguro de que no puede hacer esto, porque las vistas no pueden tener bloques BEGIN END en primer lugar. –

+0

Estás en lo cierto ... invirtiendo. Sé que he poblado vistas antes de una manera similar. –

2

Si está utilizando SQL Server 2005 puede utilizar las funciones con valores de tabla . Puede llamarlos directamente y pasar parámetros, mientras los trata como si fueran tablas.

Para más información echa un vistazo a Table-Valued User-Defined Functions

+0

Parece que las funciones con valores de tabla también están disponibles en SQL Server 2000: http://www.devarticles.com/c/a/SQL-Server/Creating-User-Fin-Functions-In-SQL-Server- 2000/4/ – polara

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

Tenga en cuenta que incluso si su MyTableValueFunction no acepta ningún parámetro, que todavía tienen que incluir paréntesis después de él, es decir:

... from dbo.MyTableValueFunction() 

Sin los paréntesis, recibirá un error de "Nombre de objeto inválido".

16
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 
+0

Intenté esto pero cuando intento ejecutar la selección * de openquery, me dice: Proveedor OLE DB "SQLNCLI11" para el servidor vinculado "local" devuelto mensaje "Tiempo de espera de inicio de sesión expirado". –

4

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 procedimiento almacenado tenemos que 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 
-3
CREATE VIEW [dbo].[dimMeasure] 
AS 

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

GO 
+3

En lugar de publicar otra respuesta con la otra mitad de la respuesta, ¿qué hay de la edición de la anterior para incluir todo lo que pretendía? (Lo he hecho por usted, compruebe que lo hice correctamente). Ahora elimínelo, a menos que realmente tenga dos respuestas diferentes a la misma pregunta. –

Cuestiones relacionadas