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

datos dinamicos en Store Procedure

Estas en el tema de datos dinamicos en Store Procedure en el foro de SQL Server en Foros del Web. Hola, tengo un SP para realizar paginacion y lo estoy modificando para que me ordene la lista de acuerdo a algun campo. Ya logre hacer ...
  #1 (permalink)  
Antiguo 15/12/2008, 09:47
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
datos dinamicos en Store Procedure

Hola, tengo un SP para realizar paginacion y lo estoy modificando para que me ordene la lista de acuerdo a algun campo. Ya logre hacer el ORDER BY para que la lista se ordene segun un campo que le paso como parametro, pero no puedo hacer que me tome el orden (asc o desc), que tambien se lo paso como parametro.

El SP es el siguiente

Código:
CREATE PROCEDURE [dbo].[GetArticulosPage] 
    @PageSize int, 
    @PageNumber int,
    @OrderBy	varchar(50),
    @OrderBySort	varchar(50)
AS 
    SELECT id_articulo, nombre, codigo, linea, padre, razonSocial 
    FROM ( 
            SELECT a.id_articulo, l.linea, l.padre, a.nombre, ap.codigo, p.razonSocial,
            ROW_NUMBER() OVER (ORDER BY a.nombre, a.id_articulo) AS RowNumber 
            FROM ARTICULO a JOIN ARTICULO_PROVEEDOR ap 
				ON a.id_articulo = ap.id_articulo JOIN LINEA l 
				ON a.id_linea = l.id_linea
				JOIN PROVEEDOR p 
				ON ap.id_proveedor = p.id_proveedor 
    ) AS Articulo  
    WHERE RowNumber BETWEEN @PageSize * @PageNumber + 1 
                    AND @PageSize * (@PageNumber + 1)
	ORDER BY 
		CASE	WHEN @OrderBy = 'razonSocial' THEN razonSocial
				WHEN @OrderBy = 'linea' THEN linea
				ELSE nombre
		END
En algun lado encontre que poniendole @OrderBySort despues del END del CASE que esta en el ORDER BY, deberia funcionar, pero el Analizador de consulta me da error justo en esa linea. Estimo que el ejemplo que encontre no es para SQLSERVER 2005 que es con lo que estoy trabajando.
Alguien tiene alguna idea de como hacerlo??

Otro problema que tengo es la de poner mas clausulas WHERE dependiendo de algunos parametros que le mando, especificamente para filtrar los resultados los cuales se eligen dinamicamente, por eso es que pueden o no estar.
Alguien sabe si se puede usar algun tipo de IF dentro del WHERE o al go parecido?

Saludos, y gracias de antemano
__________________
Nadie nacío sabiendo...
  #2 (permalink)  
Antiguo 15/12/2008, 09:52
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 9 meses
Puntos: 105
Respuesta: datos dinamicos en Store Procedure

ps lo logico seria colocar el @OrderBySort despues de end.... y si no funciona asi... despues del then concatenda con la columna a ordenar.

y que problema con where????
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #3 (permalink)  
Antiguo 15/12/2008, 10:06
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
Respuesta: datos dinamicos en Store Procedure

Al menos en SQL SERVER 2005, no funciona ninguna de las soluciones que planteas
Código:
'da error
END @OrderBySort

'tambien da error
WHEN @OrderBy = 'linea' THEN linea asc
ó
WHEN @OrderBy = 'linea' THEN linea @OrderBySort
Con respecto al Where, quiero enviar un parametro (@Nombre por ejemplo) y si no es vacio, incluirlo en la clausula where. Algo asi

Código:
WHERE RowNumber BETWEEN @PageSize * @PageNumber + 1 
                    AND @PageSize * (@PageNumber + 1)
    IF  @Nombre <> '' THEN nombre = @Nombre
¿Se entiende?, hace rato que busco en la web y no doy con la solucion.

Gracias por el aporte de todos modos.
__________________
Nadie nacío sabiendo...
  #4 (permalink)  
Antiguo 19/12/2008, 10:26
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
Respuesta: datos dinamicos en Store Procedure

Bueno, siguiendo con el tema, lo retoque un poco al SP y quedo asi:

Código:
ALTER PROCEDURE [dbo].[GetArticulosPage] 
    @PageSize int, 
    @PageNumber int,
	@OrderBy	varchar(50),
	@Nombre		varchar(100)= NULL,
	@IdLinea	int,
	@IdProv		int
AS 
    SELECT id_articulo, padre, nombre, codigo, linea,  razonSocial 
    FROM ( 
            SELECT a.id_articulo, l.linea, l.padre, a.nombre, ap.codigo, p.razonSocial,
            ROW_NUMBER() OVER (ORDER BY a.nombre, a.id_articulo) AS RowNumber 
            FROM ARTICULO a JOIN ARTICULO_PROVEEDOR ap 
				ON a.id_articulo = ap.id_articulo JOIN LINEA l 
				ON a.id_linea = l.id_linea JOIN PROVEEDOR p 
				ON ap.id_proveedor = p.id_proveedor 
			WHERE a.nombre like CASE WHEN @Nombre IS NOT NULL THEN '%'+@Nombre+'%'
								 ELSE '%%'
								 END
				AND l.id_linea = CASE WHEN @IdLinea <> 0 THEN @IdLinea
								 ELSE a.id_linea
								 END
				AND p.id_proveedor = CASE WHEN @IdProv <> 0 THEN @IdProv
								 ELSE ap.id_proveedor
								 END
    ) AS Articulo  
    WHERE RowNumber BETWEEN @PageSize * @PageNumber + 1 
                    AND @PageSize * (@PageNumber + 1)
	ORDER BY 
		CASE	WHEN @OrderBy = 'razonSocial' THEN razonSocial
				WHEN @OrderBy = 'padre' THEN padre
				WHEN @OrderBy = 'nombre' THEN nombre
				WHEN @OrderBy = 'linea' THEN linea
				ELSE nombre
		END
El tema ahora es que el order by solo funciona con datos que son numericos (id_articulo, padre y codigo en mi caso), y me da error en los datos que son varchar().
Sigue sin funcionar el tema de ASC y DESC

Cualquier ayuda, es bienvenida.
Saludos
__________________
Nadie nacío sabiendo...
  #5 (permalink)  
Antiguo 19/12/2008, 11:53
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
Desacuerdo Respuesta: datos dinamicos en Store Procedure

todo esto es muy extraño. Haciendo prueba, detecto que este codigo:

Código:
ORDER BY
CASE	WHEN @OrderBy = 'padre' THEN id_articulo
	WHEN @OrderBy = 'razonSocial' THEN razonSocial
	ELSE nombre
END
no funciona si le mando como ordenacion a "razonSocial" (que es varchar), me dice

Código:
Error de conversión al convertir el valor nvarchar 'Proveedor 2' al tipo de datos int.
('proveedor 2' es el nombre de un proveedor, el campo es varchar)
pero si funciona si le mando "padre" (que es int)


Ahora, si yo quito la siguiente linea:

WHEN @OrderBy = 'padre' THEN id_articulo

y le mando "razonSocial", ¡¡Funciona!!.
Es una locura. Es solo un order by, no es una cosa tan rara en SQL, no puedo entender porque si le pongo un campo numerico en un CASE WHEN me tome como numericos todos los demas CASE WHEN

me parece que abandono la programacion, me voy a estudiar Jardineria.
__________________
Nadie nacío sabiendo...
  #6 (permalink)  
Antiguo 19/12/2008, 13:53
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Respuesta: datos dinamicos en Store Procedure

Debes hacer un CONVERT o CAST

WHEN @OrderBy = 'padre' THEN cast(id_articulo as varchar)
  #7 (permalink)  
Antiguo 19/12/2008, 14:03
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años
Puntos: 1
De acuerdo Respuesta: datos dinamicos en Store Procedure

IIslas, gracias por tu aporte. La verdad que probe eso y no funciono, pero encontre la solucion. Aqui va textualmente la respuesta que encontre en un sitio:

Cita:
...si las columnas tienen tipos de datos distintos, no puedes utilizarlas juntas en la misma expresión CASE, ya que una expresión CASE tiene sólo un tipo de datos...
Solucion:
Código:
ORDER BY
    CASE  WHEN @OrderBy = 'padre' THEN id_articulo ELSE NULL END,
    CASE  WHEN @OrderBy = 'razonSocial' THEN razonSocial ELSE NULL END
Ahora si, funciona 10 puntos....
__________________
Nadie nacío sabiendo...
  #8 (permalink)  
Antiguo 19/12/2008, 18:56
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Respuesta: datos dinamicos en Store Procedure

Que extraño, yo lo he manejado con CAST o CONVERT sin problema alguno, pero bueno, gracias por compartir
  #9 (permalink)  
Antiguo 22/12/2008, 08:03
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: datos dinamicos en Store Procedure

Si, yo tambien he utilizado el cast y convert en el case cuando los tipos son diferentes...

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
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




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