2009-05-27 16 views

risposta

20

Questa costruzione non è consentita in SQL Server. Una funzione con valori inline può essere eseguita come una vista parametrizzata, ma non è ancora possibile chiamare un SP come questo.

Ecco alcuni esempi di utilizzo di un SP e di un TVF in linea in modo intercambiabile: vedrete che il TVF è più flessibile (in pratica è più simile a una vista che a una funzione), quindi dove è possibile utilizzare un TVF in linea, possono essere più ri-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

Dovresti scrivere la vista come in basso. Scriverai essenzialmente i risultati del tuo proc in una tabella var o temp table, quindi selezionerai nella vista.

Modifica - Se è possibile modificare la stored procedure per una funzione tabella dei valori, si eliminerebbe la fase di selezionare per una tabella temporanea.

** Modifica 2 ** - I commenti sono corretti che uno sproc non può essere letto in una vista come suggerito. Invece, convertire il proc a una funzione di tabella-value come detto in altri post e scegliere da che:

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

Mi scuso per la confusione

+0

Sono abbastanza sicuro che non è possibile farlo in SQL Server. –

+0

In realtà, sono certo che non è possibile farlo, perché le viste non sono autorizzati ad avere BEGIN END blocchi in primo luogo. –

+0

Hai ragione ... investingating. So di aver popolato le visualizzazioni prima in un modo simile. –

2

Se si utilizza SQL Server 2005 è possibile utilizzare le funzioni con valori di tabella . Puoi chiamarli direttamente e passare i paramter, trattandoli come se fossero tavoli.

Per maggiori informazioni controllare Table-Valued User-Defined Functions

+0

Sembra che le funzioni con valori di tabella siano disponibili anche in SQL Server 2000: 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 

si noti che anche se il vostro MyTableValueFunction non accetta alcun parametro, è ancora necessario includere parentesi dopo, vale a dire:

... from dbo.MyTableValueFunction() 

Senza le parentesi, riceverai un errore "Nome oggetto non valido".

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

Ho provato questo, ma quando provo a eseguire select * da openquery, mi dice: Provider OLE DB "SQLNCLI11" per server collegato "locale" ha restituito il messaggio "Timeout di accesso scaduto". –

4

Sono stato in grado di chiamare stored procedure in 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 

All'interno stored procedure abbiamo bisogno di impostare:

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

Invece di postare un'altra risposta con l'altra metà della risposta, che ne dici di modificare la tua precedente per includere tutto ciò che intendi? (Che ho fatto per te, controlla di averlo fatto correttamente.) Ora per favore cancella questo, a meno che tu non intenda realmente due risposte diverse alla stessa domanda. –

Problemi correlati