Ir al contenido principal

SQLServer Stored Procedure Para Ordenar Columnas Ascendente / Descendente

Pues este es nuestro primer post referente a SQLServer...

En primera instancia les queremos platicar qué es lo que buscamos: 

Mediante un stored procedure obtener un listado ordenado por alguna de las columnas devueltas de manera ascendente o descendente, dependiendo de los parámetros de entrada del mismo.

Muchas de las ocasiones cuando nos ha tocado buscar información acerca de cómo hacer este proceso, solemos encontrar recomendaciones de hacerlo usando un query que se contruye en tiempo de ejecución usando una variable de tipo VARCHAR(MAX) y después hacer uso de la función EXEC para ejecutarlo.

Al final, se resuelve el problema, pero la intención es mejorar el procedimiento sin afectar el rendimiento y evitando problemas de seguridad como el SQL Injection.

Veamos un video con una propuesta diferente de resolución de este requerimiento:


Creación de la Base de Datos

Usando el siguiente query que pueden ejecutar en el cliente base de datos SQL Server crearemos la base de datos con la que trabajaremos:

CREATE DATABASE BlogspotTesting
GO

Creación de Tabla de Clientes e Insersión de Registros de Prueba

Con este query puedes crear la tabla de clientes e insertar los registros de prueba

USE BlogspotTesting
CREATE TABLE [dbo].[Clientes](
    [clave] [int] IDENTITY(1,1) NOT NULL,
    [nombres] [varchar](50) NOT NULL,
    [apaterno] [varchar](50) NOT NULL,
    [amaterno] [varchar](50) NOT NULL,
    CONSTRAINT [PK_Clientes] PRIMARY KEY CLUSTERED 
    (
 [clave] ASC
    )
)
GO

USE BlogspotTesting
INSERT INTO Clientes (nombres, apaterno, amaterno)
VALUES ('CARLOS', 'ESTRADA', 'IBARRA')
GO

USE BlogspotTesting
INSERT INTO Clientes (nombres, apaterno, amaterno)
VALUES ('OLGA', 'SOSA', 'YAÑEZ')
GO

USE BlogspotTesting
INSERT INTO Clientes (nombres, apaterno, amaterno)
VALUES ('GABRIEL', 'MENDEZ', 'PARDO')
GO

USE BlogspotTesting
INSERT INTO Clientes (nombres, apaterno, amaterno)
VALUES ('SANDRA', 'ZAPATA', 'CARMONA')
GO

USE BlogspotTesting
INSERT INTO Clientes (nombres, apaterno, amaterno)
VALUES ('HÉCTOR', 'LÓPEZ', 'TAVAREZ')
GO

USE BlogspotTesting
INSERT INTO Clientes (nombres, apaterno, amaterno)
VALUES ('BRENDA', 'FRANCO', 'JUÁREZ')
GO

Creación del Stored Procedure

USE [BlogspotTesting]
GO
-- ======================================================
-- Author: Nivisix Soluciones
-- Create date: Lunes 19 de Junio de 2017
-- Description: Obtiene la lista de clientes ordenados 
--  por la columna especificada de manera 
--  ascendente o descendente
-- ======================================================
CREATE PROCEDURE [dbo].[uspObtenerClientes] @orderBy TINYINT = 1, 
    @descendente BIT = 'False'
AS BEGIN
    SET NOCOUNT ON;

    SELECT nombres, apaterno, amaterno
    FROM Clientes
    ORDER BY
    CASE WHEN @orderBy = 1 AND @descendente = 'False' THEN nombres END,
    CASE WHEN @orderBy = 1 AND @descendente = 'True' THEN nombres END DESC,
    CASE WHEN @orderBy = 2 AND @descendente = 'False' THEN apaterno END,
    CASE WHEN @orderBy = 2 AND @descendente = 'True' THEN apaterno END DESC,
    CASE WHEN @orderBy = 3 AND @descendente = 'False' THEN amaterno END,
    CASE WHEN @orderBy = 3 AND @descendente = 'True' THEN amaterno END DESC
END
GO

Pruebas y Resultados


USE BlogspotTesting
GO

-- Listado ordenado por nombres de manera ascendente 
uspObtenerClientes
GO

-- Listado ordenado por nombres de manera descendente
uspObtenerClientes 1, 'True'
GO

-- Listado ordenado por apellido paterno de manera ascendente
uspObtenerClientes 2
GO

-- Listado ordenado por apellido paterno de manera descendente
uspObtenerClientes 2, 'True'
GO

-- Listado ordenado por apellido materno de manera ascendente
uspObtenerClientes 3, 'False'
GO

-- Listado ordenado por apellido materno de manera descendente
uspObtenerClientes 3, 'True'
GO

-- Listado ordenado por otra columna no especificada de manera descendente
-- Devuelve el listado por default (como fueron insertados)
uspObtenerClientes 5, 'True'
GO

Resultados Ejemplo 1


Resultados Ejemplo 2



Resultados Ejemplo 3


Resultados Ejemplo 4



Resultados Ejemplo 5



Resultados Ejemplo 6



Resultados Ejemplo 7



Descarga de Código Fuente

En esta ocasión pondremos a tu disposición un backup de la base de datos creada en SQLServer Express 2014 que puedes descargar haciendo clic aquí: BlogspotTesting.bak

Puedes descargar SQL Server Express 2014 desde esta liga [SQLExpress2014] para que realices el restore de la base de datos.

No olvides seleccionar las opciones:
  • SQLEXPRWT_x[86 ó 64]_ENU.exe
  • SQLManagementStudio_x[86 ó 64]_ENU.exe 
La primera es el motor de la base de datos y la segunda el cliente de SQLServer

Saludos!

Comentarios

Entradas más populares de este blog

Publicación de WCF en Net.TCP

Una de las grandes características de WCF es la forma en como éstos pueden ser expuestos a nuestros clientes, por ejemplo los siguientes protocolos, de manera muy recurrente: Http TCP Net Pipe ¿Sabes en que casos usar cada uno? Http cuando el servicio y el cliente se encuentran en redes diferentes TCP cuando el servicio y el cliente se encuentran en la misma red, pero en equipos diferentes Net Pipe cuando el servicio y el cliente se encuentran alojados en el mismo equipo ¿Por qué razón? Por cuestiones de redimiento y seguridad de la información Si una petición http toma un tiempo de 200 ms, por poner un ejemplo Una petición tcp tomará aproximadamente el 20% menos que la petición http (40 ms aproximadamente) Y una petición Net Pipe , tomará aproximadamente el 80% del tiempo que toma el hacer una petición tcp (32 ms aproximadamente) Para mayor entendimiento, chequen este post que alguna vez consultamos para entender un poco más acerca de éstos conceptos: https://j...

Validación de Fechas con jQuery Validator

Al validar fechas con jQuery Validate nos encontramos con el problema de que dicha validación se hace en formato: MM/DD/YYYY, esto es correcto, pero no tanto para formato de fechas de México al menos que es más común para nosotros hacerlo de manera que dicho formato sea: DD/MM/YYYY. Para poder solucionar este problema haremos algunas modificaciones en las librerías: jquery.validate.js jquery.validate.min.js Veamos el siguiente video para la implementación de dicha solución: jquery.validate.js Se deja comentado el cómo se hace la validación original y se adiciona el código personalizado que permite validar el formato de fecha del tipo: DD/MM/YYYY 1 2 3 4 5 6 7 8 9 10 11 // http://jqueryvalidation.org/date-method/ // Nivisix Soluciones: personalización para formato de fechas DD/MM/YYYY date : function ( value, element ) { //return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() ); var com...