2011-11-21 4 views
8

Ho provato a chiamare un filtro in linea TVF con i parametri posizionali e funziona benissimo:Chiamando un TVF in linea con parametri denominati, qual è la sintassi corretta?

SELECT MyTable.Col1, 
     (SELECT TvfColumn FROM ufnGetData(MyTable.Col1, MyTable.Col2)), 
     MyTable.Col2 
FROM MyTable 

poi ho cercato di nominare i parametri al TVF e non analizza:

SELECT MyTable.Col1, 
     (SELECT TvfColumn FROM ufnGetData(@Param1=MyTable.Col1, @Param2=MyTable.Col2)), 
     MyTable.Col2 
FROM MyTable 

La funzione sembra qualcosa di simile:

CREATE FUNCTION dbo.ufnGetData 
( 
    @Param1 INT, 
    @Param2 INT 
) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT 
     blah blah blah AS TvfColumn 
) 
GO 

Dare un errore simile a:

Msg 137, livello 15, stato 2, riga 23 Deve dichiarare la variabile scalare "@ Param2".

Messaggio 102, livello 15, stato 1, riga 24 Sintassi non corretta vicino a ",".

Cosa sto sbagliando?

risposta

7

Le funzioni definite dall'utente con valori di tabella non possono essere considerate come una stored procedure. Non si usano parametri con nome mentre li si chiama, è basato sulla posizione. Quindi, in altre parole, ciò che stai cercando di fare non è possibile.

C'è un motivo per cui si desidera utilizzare i parametri denominati? È necessario avere tutti i parametri definiti, quindi non vi è alcun vantaggio reale che si vedrebbe normalmente con le stored procedure.

+7

Il vero vantaggio è che posso modificare l'ordine dei parametri nel TVF senza influire sui chiamanti. È anche più facile vedere quali sono i parametri, se vengono denominati, anche se posso ottenere lo stesso effetto con commenti in linea ben posizionati. –

+0

@MichaelGoldshteyn Spiacente, non è possibile con SQL Server. –

+4

RE: "o qualsiasi funzione". Questo non è vero. Le UDF scalari possono essere richiamate con 'EXEC' e accettare parametri con nome in quel caso. –