Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

crear funcion: cual es mi error ???

Estas en el tema de crear funcion: cual es mi error ??? en el foro de SQL Server en Foros del Web. hola, cree una funcion para que me genera el ide siguiente, osea, el maximo + 1, el código es el siguiente: Código: create function uf_generar_ide ...
  #1 (permalink)  
Antiguo 08/05/2009, 11:56
Avatar de hector2c  
Fecha de Ingreso: noviembre-2007
Ubicación: Perú - Tacna
Mensajes: 979
Antigüedad: 17 años, 1 mes
Puntos: 25
Pregunta crear funcion: cual es mi error ???

hola, cree una funcion para que me genera el ide siguiente, osea, el maximo + 1, el código es el siguiente:

Código:
create function uf_generar_ide (@campo varchar(40), @tabla varchar(40) )
	returns int
as
begin
	declare @max int
	set @max = (select max(@campo) from @tabla)
	if (@max is null)
		set @max=1
	else
		set @max = @max + 1
	return @max
end
me da el siguiente error:

Código:
Servidor: mensaje 137, nivel 15, estado 2, procedimiento uf_generar_ide, línea 6
Debe declarar la variable '@tabla'.
en esta linea:

Código:
set @max = (select max(@campo) from @tabla)

cual creen que sea el error??? cual seria otra opción en caso no se pueda :S
__________________
blog: hector2c.wordpress.com
email: [email protected]
  #2 (permalink)  
Antiguo 08/05/2009, 12:23
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años, 6 meses
Puntos: 220
Respuesta: crear funcion: cual es mi error ???

El problema esta q la tabla y la columna no pueden ser declaradas tipo varchar para poder resolver tu problema prueba con lo siguiente
Código sql:
Ver original
  1. CREATE FUNCTION GenerarId
  2. (  
  3.     @Id    VARCHAR(50),
  4.     @Tabla VARCHAR(50)
  5. )
  6.     RETURNS INT
  7. AS
  8. BEGIN
  9.  
  10.     DECLARE @MAX INT             -- Variable de Salida q me Captura el Id
  11.    
  12.     DECLARE @SQL NVARCHAR(MAX)   -- Variable para Ejecutar una Sentencia SQL   
  13.     DECLARE @Param NVARCHAR(MAX) -- Variable para Mandar parametros a la Consulta
  14.  
  15.     SET @Param = N'@ParamId INT OUTPUT' -- Variable a Enviar
  16.     SET @SQL = N'SELECT @ParamId = MAX(' + @Id + ')
  17.                  FROM ' + @Tabla + ';'
  18.  
  19.     EXECUTE SP_EXECUTESQL @SQL, @Param, @ParamId = @MAX OUTPUT;
  20.  
  21.     IF @MAX IS NULL
  22.         SET @MAX = 1;
  23.     ELSE
  24.         SET @MAX = @MAX + 1;
  25.        
  26.     RETURN @MAX
  27. END

lo que realiza el codigo es primero crear una variable nvarchar q recibira la cadena sql ( en formato texto ) luego a traves de la variable @Param le enviamos los parametros a declarar como si fuera un declare normal pero como se va a ejecutar en forma de cadena nuestra sentencia sql entonces debemos declarar la variable param.Nota q el parametro declarado es de tipo output ya q lo necesitamos para q nos devuelva el max de la tabla puedes incluir otras variables para poder hacer verificaciones (where) .
al final se ejecuta la variable sql a traves del proc. SP_EXECUTESQL enviamos los parametros y al final recibimos la variable de salida para tomar el valor devuelto y lo resto es historia.
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #3 (permalink)  
Antiguo 11/05/2009, 16:04
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: crear funcion: cual es mi error ???

Puedes eliminar el IF @Max IS NULL, por

SET @SQL = N'SELECT @ParamId = ISNULL(MAX(' + @Id + ', 1)
  #4 (permalink)  
Antiguo 11/05/2009, 20:13
 
Fecha de Ingreso: abril-2009
Mensajes: 40
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: crear funcion: cual es mi error ???

otra opcion seria usar el siguiente codigo:


DECLARE @ULTIMOID INTEGER

--en donde SCOPE_IDENTITY() te regresa el id del ultimo elemento insertado en la tabla
@ULTIMOID=SCOPE_IDENTITY()

si necesitas esta valor mas uno quedaria algo como lo siguiente:

DECLARE @ULTIMOID_MASUNO INTEGER

@ULTIMOID_MASUNO =SCOPE_IDENTITY()+1
  #5 (permalink)  
Antiguo 12/05/2009, 07:32
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años, 6 meses
Puntos: 220
Respuesta: crear funcion: cual es mi error ???

Excelente Idea iislas habia utilizado antes el IsNull pero se me habia olvidado colocarlo Gracias de igual Modo
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #6 (permalink)  
Antiguo 12/05/2009, 19:21
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: crear funcion: cual es mi error ???

Saludos a todos.......
  #7 (permalink)  
Antiguo 12/05/2009, 23:51
Avatar de hector2c  
Fecha de Ingreso: noviembre-2007
Ubicación: Perú - Tacna
Mensajes: 979
Antigüedad: 17 años, 1 mes
Puntos: 25
Respuesta: crear funcion: cual es mi error ???

WOOOOOOOOOOOOOOW, este foro de mssql-server si que es muy activo, gracias, gracias a todos!!!
__________________
blog: hector2c.wordpress.com
email: [email protected]
  #8 (permalink)  
Antiguo 15/05/2009, 09:47
Avatar de hector2c  
Fecha de Ingreso: noviembre-2007
Ubicación: Perú - Tacna
Mensajes: 979
Antigüedad: 17 años, 1 mes
Puntos: 25
Pregunta Respuesta: crear funcion: cual es mi error ???

hola a todos, disculpen, tal vez este errando, ejecuto el siguiente script de Dradi7:

Código HTML:
select dbo.GenerarId('ide_cus', 'cargo_usuario')
pero siempre me da nulo, tiene 4 registros, deberia botarme 5, verdad?? cual es mi error :S

lo e usado en sql2005 y puedo guardar la funcion, pero en sql2000 no puego guardarla...

aun ais, en sql2005 no me devuelve ningun valor :S

espero me ayuden, gracias de antemano!!!
__________________
blog: hector2c.wordpress.com
email: [email protected]
  #9 (permalink)  
Antiguo 15/05/2009, 10:30
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años, 6 meses
Puntos: 220
Respuesta: crear funcion: cual es mi error ???

Bueno hola he hecho una serie de modificaciones con respecto a lo q me decia Islas y lo q me di cuenta al probarlo q no ejecutaba la funcion por eso decidi crearlo en un Proc Almacenado
Código sql:
Ver original
  1. CREATE PROCEDURE GenerarId
  2. (  
  3.     @Id    VARCHAR(50),
  4.     @Tabla VARCHAR(50),
  5.     @MAX   INT = NULL OUTPUT
  6. )
  7. AS
  8. BEGIN
  9.  
  10.  
  11.     DECLARE @SQL NVARCHAR(MAX)   -- Variable para Ejecutar una Sentencia SQL    
  12.     DECLARE @Param NVARCHAR(MAX) -- Variable para Mandar parametros a la Consulta
  13.  
  14.     SET @Param = N'@ParamId INT OUTPUT' -- Variable a Enviar
  15.     SET @SQL = N'SELECT @ParamId = ISNULL(MAX(' + @Id + ') + 1,1)
  16.                 FROM ' + @Tabla + ';'
  17.  
  18.     EXECUTE SP_EXECUTESQL @SQL, @Param, @ParamId = @MAX OUTPUT;
  19.     SELECT @MAX;
  20. END
  21.  
  22. -- Para Tomar el Valor Devuelto
  23. DECLARE @MAX INT
  24. EXEC GenerarId 'id','documento',@MAX output;
  25. print @MAX;
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #10 (permalink)  
Antiguo 15/05/2009, 13:39
Avatar de hector2c  
Fecha de Ingreso: noviembre-2007
Ubicación: Perú - Tacna
Mensajes: 979
Antigüedad: 17 años, 1 mes
Puntos: 25
Pregunta Respuesta: crear funcion: cual es mi error ???

wooo, amigo, te pasaste, si funciona, aunque para sql2005...

disculpa la confianza, pero, que deberia modificar para que soporte en sql2000 ???

Código:
Servidor: mensaje 170, nivel 15, estado 1, procedimiento GenerarId, línea 7
Línea 7: sintaxis incorrecta cerca de 'MAX'.
Servidor: mensaje 170, nivel 15, estado 1, procedimiento GenerarId, línea 8
Línea 8: sintaxis incorrecta cerca de 'MAX'.
Servidor: mensaje 137, nivel 15, estado 1, procedimiento GenerarId, línea 10
Debe declarar la variable '@Param'.
Servidor: mensaje 137, nivel 15, estado 1, procedimiento GenerarId, línea 12
Debe declarar la variable '@SQL'.
Servidor: mensaje 137, nivel 15, estado 1, procedimiento GenerarId, línea 12
Debe declarar la variable '@SQL'.
aunque no es mas el decir que me servira para las aplicaciones que uso actualmente en sql2005!!!
__________________
blog: hector2c.wordpress.com
email: [email protected]
  #11 (permalink)  
Antiguo 15/05/2009, 14:07
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años, 6 meses
Puntos: 220
Respuesta: crear funcion: cual es mi error ???

Si no me equivoco en sql 2000 los nvarchar se declaran como ntext

y prueba a ver si te funciona un Exec('consulta cualquiera')
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #12 (permalink)  
Antiguo 15/05/2009, 16:03
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 5 meses
Puntos: 180
Respuesta: crear funcion: cual es mi error ???

Nop

DECLARE @SQL NVARCHAR(255) -- Variable para Ejecutar una Sentencia SQL
DECLARE @Param NVARCHAR(255) -- Variable para Mandar parametros a la Consulta
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 00:35.