2011-11-21 10 views
8

Próbowałem nazywając in-line TVF z parametrów pozycyjnych i działa prawidłowo:Wywołanie in-line TVF z nazwanymi parametrami, jaka jest właściwa składnia?

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

Potem starałem się wymienić parametry do TVF i nie analizuje:

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

Funkcja wyglądał:

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

Nadanie błąd podobny do:

Msg 137, Poziom 15, Stan 2, Wiersz 23 Musi zadeklarować zmienną skalarną "@ Param2".

Msg 102, Poziom 15, Stan 1, Wiersz 24 Niepoprawna składnia w pobliżu ",".

Co robię źle?

Odpowiedz

7

Funkcje zdefiniowane przez użytkownika tabeli nie mogą być traktowane jak procedura składowana. Nie używasz nazwanych parametrów podczas ich wywoływania, jest oparty na pozycjach. Innymi słowy, to, co próbujesz zrobić, nie jest możliwe.

Czy istnieje powód, dla którego chcesz używać nazwanych parametrów? Musisz zdefiniować wszystkie parametry, więc nie ma rzeczywistej korzyści, którą normalnie widziałbyś w procedurach przechowywanych.

+7

Prawdziwą korzyścią jest to, że mogę zmienić kolejność parametrów w TVF bez wpływu na osoby dzwoniące. Łatwiej też zobaczyć, jakie są parametry, jeśli są nazwane, chociaż mogę uzyskać ten sam efekt dzięki dobrze umieszczonym komentarzom wstawianym. –

+0

@MichaelGoldshteyn Niestety, nie jest to możliwe z SQL Server. –

+4

RE: "lub dowolna funkcja". To nie jest prawda. Skalarne UDF można wywoływać za pomocą 'EXEC' i przyjmować nazwane parametry w tym przypadku. –

Powiązane problemy