jueves, 30 de mayo de 2013

Plantilla para crear cursores en T-SQL MS Sql Server 2008

Hola muy buenas,

Como ya sabéis, publico de muy tarde en tarde, por lo que pido disculpas. Sin embargo el contenido que quiero poner en mi blog, es de cosecha propia.

Bueno, esta vez voy a aportar un pequeño código en SQL que nos va a permitir generar cursores, tan solo con indicar el nombre de la tabla que queremos realizar el cursor.

La motivación de realizar este pequeño código, es debido a que el equipo de desarrollo software que lidero, tarda en realizar tareas repetitivas como crear cursores, sobre todo cuando son cursores sobre tablas con un número alto de columnas.
El código es el siquiente:
       
declare @nombreTabla as sysname;
DECLARE @ORDINAL_POSITION AS INT,
@COLUMN_NAME AS sysname,
@DATA_TYPE AS NVARCHAR (50),
@CHARACTER_MAXIMUM_LENGTH AS INT,
@IS_NULLABLE AS VARCHAR,
@COLUMN_DEFAULT AS NVARCHAR,
@listaColumnas AS NVARCHAR (4000),
@listaVariables AS NVARCHAR (4000);

set @nombreTabla='Catalogo'

DECLARE cTable CURSOR    FOR SELECT   ORDINAL_POSITION,
                 COLUMN_NAME,
                 DATA_TYPE,
                 CHARACTER_MAXIMUM_LENGTH,
                 IS_NULLABLE,
                 COLUMN_DEFAULT
        FROM     INFORMATION_SCHEMA.COLUMNS
        WHERE    TABLE_NAME = @nombreTabla
        ORDER BY ORDINAL_POSITION ASC;

SET @listaColumnas = '';

SET @listaVariables = '';

OPEN cTable;

-- Lectura de la primera fila del cursor
FETCH cTable INTO @ORDINAL_POSITION, @COLUMN_NAME, @DATA_TYPE, @CHARACTER_MAXIMUM_LENGTH, @IS_NULLABLE, @COLUMN_DEFAULT;

WHILE (@@FETCH_STATUS = 0)
    BEGIN
        IF @listaColumnas <> ''
            BEGIN
                SET @listaColumnas = @listaColumnas + ',';
                SET @listaVariables = @listaVariables + ',';
            END
        SET @listaColumnas = @listaColumnas + @COLUMN_NAME;
        SET @listaVariables = @listaVariables+ '@' + @COLUMN_NAME;
        IF @CHARACTER_MAXIMUM_LENGTH IS NOT NULL
            BEGIN
                PRINT 'DECLARE @' + @COLUMN_NAME + ' as ' + @DATA_TYPE + '(' + CONVERT (VARCHAR (10), @CHARACTER_MAXIMUM_LENGTH) + ')';
            END
        ELSE
            BEGIN
                PRINT 'DECLARE @' + @COLUMN_NAME + ' as ' + @DATA_TYPE;
            END
        FETCH cTable INTO @ORDINAL_POSITION, @COLUMN_NAME, @DATA_TYPE, @CHARACTER_MAXIMUM_LENGTH, @IS_NULLABLE, @COLUMN_DEFAULT;
    END
PRINT ''
PRINT 'DECLARE c'+@nombreTabla+' CURSOR    FOR SELECT '+ @listaColumnas+' from '+@nombreTabla;
PRINT ''
PRINT 'OPEN c'+@nombreTabla
PRINT 'FETCH c'+@nombreTabla+' INTO '+@listaVariables
PRINT ''
PRINT 'WHILE (@@FETCH_STATUS = 0)'
PRINT 'BEGIN'
PRINT ''
PRINT 'FETCH c'+@nombreTabla+' INTO '+@listaVariables
PRINT 'END'
PRINT ''
PRINT 'CLOSE c'+@nombreTabla
PRINT 'DEALLOCATE c'+@nombreTabla

-- Cierre del cursor
CLOSE cTable;

-- Liberar los recursos
DEALLOCATE cTable;


Espero que con esta aportación podáis incrementar vuestra productividad en los desarrollos.

No hay comentarios:

Publicar un comentario