Atrapado en una funcion

26/10/2005 - 15:56 por amigo | Informe spam
Estoy haciendo una función que me entregue un indice generado :
CREATE FUNCTION dbo.fIndiceCli

(

@bAgencia bit,

@Tabla varchar,

@IndiceTbl varchar,

@Cliente varchar(5),

@ClienteTbl varchar

)

RETURNS int

AS

Begin

DECLARE @IndiceMax int

If bAgencia then

SELECT @IndiceMax = MAX(@IndiceTbl) + 1

FROM @Tabla

WHERE @ClienteTbl = @Cliente

Else

SELECT @IndiceMax =MIN(@IndiceTbl)-1

FROM @Tabla

WHERE @ClienteTbl='@Cliente'

End

RETURN @IndiceMax



p.d.: nunca antes me habia puesot a hacer una funcion en SqlServer
 

Leer las respuestas

#1 Alejandro Mesa
26/10/2005 - 16:35 | Informe spam
amigo,

Los nombres de columnas y / o tablas no pueden ser parametrizados en una
sentencia "select", por lo que la sentencia:

SELECT @IndiceMax = MAX(@IndiceTbl) + 1

FROM @Tabla

WHERE @ClienteTbl = @Cliente



no funcionara sin importar si la pones en una funcion, en un procedimiento
almacenado o un query ad-hoc.

Esto pudiera hacerse usando sql dinamico, pero no se puede ejecutar un
procedimiento desde una funcion, al menos que sea un procedimiento extendido,
por lo que tendras que usar un procedimiento almacenado en vez de una funcion.

CREATE procedure dbo.usp_IndiceCli

(

@bAgencia bit,

@Tabla varchar, -- esto es equivalente a varchar(1)

@IndiceTbl varchar, -- esto es equivalente a varchar(1)

@Cliente varchar(5),

@ClienteTbl varchar, -- esto es equivalente a varchar(1)

@i int output
)
AS

set nocount on

declare @sql nvarchar(4000)

If @bAgencia = 1 then

set @sql = N'SELECT @IndiceMax = MAX(' + @IndiceTbl + N') + 1 FROM ' +
@Tabla + N' WHERE @ClienteTbl = ''' + @Cliente + N''''
Else

set @sql = N'SELECT @IndiceMax = MIN(' + @IndiceTbl + N') - 1 FROM ' +
@Tabla + N' WHERE @ClienteTbl = ''' + @Cliente + N''''
End

execute sp_executesql @sql, N'@IndiceMax int output', @i output

return @@error
go

declare @i int

exec dbo.usp_IndiceCli 1, 'a', 'a', 'mssql', null, @i output

select @i
go

Chequea los comentarios que agregue en la declaracion de los parametros
dentro del sp.

@Tabla varchar, -- esto es equivalente a varchar(1)
@IndiceTbl varchar, -- esto es equivalente a varchar(1)
@ClienteTbl varchar, -- esto es equivalente a varchar(1)


Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"amigo" wrote:

Estoy haciendo una función que me entregue un indice generado :
CREATE FUNCTION dbo.fIndiceCli

(

@bAgencia bit,

@Tabla varchar,

@IndiceTbl varchar,

@Cliente varchar(5),

@ClienteTbl varchar

)

RETURNS int

AS

Begin

DECLARE @IndiceMax int

If bAgencia then

SELECT @IndiceMax = MAX(@IndiceTbl) + 1

FROM @Tabla

WHERE @ClienteTbl = @Cliente

Else

SELECT @IndiceMax =MIN(@IndiceTbl)-1

FROM @Tabla

WHERE @ClienteTbl='@Cliente'

End

RETURN @IndiceMax



p.d.: nunca antes me habia puesot a hacer una funcion en SqlServer



Preguntas similares