2011-11-21 12 views
8

He intentado llamar a una TVF en línea con los parámetros de posición y funciona bien:Llamar a un TVF en línea con parámetros con nombre, ¿cuál es la sintaxis correcta?

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

Luego trató de nombrar los parámetros a la TVF y no analiza:

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

La función se ve algo como:

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

Dar un error similar al siguiente:

Msg 137, nivel 15, estado 2, línea 23 Debe declarar la variable escalar "@ Param2".

Msg 102, nivel 15, estado 1, línea 24 Sintaxis incorrecta cerca de ','.

¿Qué estoy haciendo mal?

Respuesta

7

Las funciones definidas por el usuario con valores de tabla no se pueden tratar como un procedimiento almacenado. No usa parámetros nombrados mientras los llama, está basado en posición. Entonces, en otras palabras, lo que estás tratando de hacer no es posible.

¿Hay algún motivo por el que desee utilizar parámetros con nombre? Necesita tener todos los parámetros definidos, por lo que no hay un beneficio real que normalmente vería con los procedimientos almacenados.

+7

El beneficio real es que puedo cambiar el orden de los parámetros en el TVF sin afectar a las personas que llaman. También es más fácil ver cuáles son los parámetros, si se nombran, aunque puedo obtener el mismo efecto con comentarios en línea bien colocados. –

+0

@MichaelGoldshteyn Lo sentimos, no es posible con SQL Server. –

+4

RE: "o cualquier función". Esto no es verdad. Las UDF escalares se pueden invocar con 'EXEC' y aceptar parámetros nombrados en ese caso. –

Cuestiones relacionadas