2009-05-27 18 views

Antwort

20

aus ist diese Konstruktion nicht in SQL Server erlaubt. Eine Inline-Tabellenwertfunktion kann als parametrisierte Ansicht ausgeführt werden, es ist jedoch weiterhin nicht zulässig, einen SP so aufzurufen.

Hier sind einige Beispiele für die synchrone Verwendung eines SP und eines Inline-TVF - Sie werden sehen, dass der TVF flexibler ist (im Grunde eher eine Ansicht als eine Funktion). Wenn also ein Inline-TVF verwendet werden kann mehr Wieder 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

Sie müssten die Ansicht wie unten skripten. Sie würden im Wesentlichen die Ergebnisse Ihres Procs in eine Tabelle var oder eine temporäre Tabelle schreiben und dann in die Ansicht auswählen.

bearbeiten - Wenn Sie Ihre gespeicherte Prozedur auf einen Tabellenwert-Funktion ändern können, würde es den Schritt der Auswahl auf eine temporäre Tabelle beseitigen.

** Edit 2 ** - Kommentare sind korrekt, dass ein Sproc nicht in eine Ansicht gelesen werden kann, wie ich es vorgeschlagen habe. Stattdessen wandeln Sie Ihre proc auf einen Tabellenwertfunktion wie in anderen Beiträgen erwähnt, und wählen Sie aus, dass:

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

ich für die Verwirrung entschuldigen

+0

Ich bin mir ziemlich sicher, dass Sie dies in SQL Server nicht tun können. –

+0

Ich bin mir sicher, dass Sie dies nicht tun können, da Sichten an erster Stelle keine BEGIN END Blöcke haben dürfen. –

+0

Sie haben Recht ... investieren. Ich weiß, dass ich zuvor Ansichten auf ähnliche Weise bevölkert habe. –

2

Wenn Sie SQL Server 2005 verwenden, können Sie Tabellenwertfunktionen verwenden . Sie können diese direkt aufrufen und Parameter übergeben, während Sie sie wie Tische behandeln.

überprüfen Für weitere Informationen Table-Valued User-Defined Functions

+0

Es scheint, dass Tabellenwertfunktionen auch in SQL Server 2000 verfügbar sind: http://www.devarticles.com/c/a/SQL-Server/Creating-User-Defined-Functions-In-SQL-Server- 2000/4/ – polara

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

Beachten Sie, dass, auch wenn Ihr MyTableValueFunction keine Parameter akzeptieren, müssen Sie noch Klammern, nachdem es schließen, das heißt:

... from dbo.MyTableValueFunction() 

Ohne die Klammern erhalten Sie den Fehler "Ungültiger Objektname".

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

Ich versuchte dies, aber wenn ich versuche, die Auswahl * von OpenQuery auszuführen, sagt es mir: OLE DB-Provider "SQLNCLI11" für den Verbindungsserver "lokale" zurückgegebene Nachricht "Login-Timeout abgelaufen". –

4

Ich konnte gespeicherte Prozedur in einer Ansicht aufrufen (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 

Innerhalb gespeicherte Prozedur müssen wir festlegen:

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

Anstatt eine andere Antwort mit der anderen Hälfte der Antwort zu posten, wie wäre es mit der Bearbeitung Ihrer vorherigen, um alles, was Sie beabsichtigten, einzuschließen? (Was ich für Sie getan habe; überprüfen Sie, ob ich das richtig gemacht habe.) Löschen Sie dies jetzt, es sei denn, Sie wollten wirklich zwei verschiedene Antworten auf die gleiche Frage. –