viernes, 6 de junio de 2014

Generación automática de procedimientos almacenados.

Hola, después de mucho tiempo una nueva entrada, hoy se presento la necesidad de hacer muchos procedimientos almacenados exactamente iguales de diferentes tablas, a lo cual se me ocurrió la siguiente solución, mediante un procedimiento almacenado generar automáticamente los DDL del CRUD.

En un solo procedimiento almacenado reuniré todas las transacciones. Me cuentan si tienen preguntas, funciona con sql server

--primero una variable con el nombre de la tabla a la cual le generaremos el procedimiento almacenado

SET @TABLA='aqui va el nombre de la tabla'


--Luego las variables que vamos a usar durante el proceso son:

Declare @NombreCampo as Varchar(512)
Declare @Tipo as Varchar(512)
Declare @Tamanho as Varchar(512)
DECLARE @Cadena_Insercion as NVARCHAR(2048)
DECLARE @Cadena_Variables as NVARCHAR(2048)
DECLARE @Cadena_Actualizacion AS NVARCHAR(2048)
DECLARE @Cadena_and AS NVARCHAR(2048)

--Aqui comienza el cursor que utilizaremos

Declare AutomaticTable cursor For
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = @TABLA

OPEN AutomaticTable

SET @Cadena_Insercion=''
SET @Cadena_Variables=''
SET @Cadena_Actualizacion=''
SET @Cadena_and=''


Fetch Next From AutomaticTable
Into @NombreCampo, @Tipo, @Tamanho

PRINT 'CREATE PROCEDURE Proc_'+@TABLA+' as'
PRINT ' '

PRINT ' '
PRINT 'BEGIN'

PRINT ' '
PRINT ' DECLARE @ITRAN AS INT'

WHILE @@FETCH_STATUS=0

BEGIN

IF @Tamanho IS NOT NULL
BEGIN
PRINT ' DECLARE @'+ @NombreCampo+' AS '+@Tipo + '('+@Tamanho+')'
END
ELSE
BEGIN
PRINT ' DECLARE @'+ @NombreCampo+' AS '+@Tipo
END

set @Cadena_Insercion = @Cadena_Insercion + ',' + @NombreCampo
set @Cadena_Variables = @Cadena_Variables + ',@' + @NombreCampo
SET @Cadena_Actualizacion = + @Cadena_Actualizacion + @NombreCampo + '=@' + @NombreCampo + ','
SET @Cadena_and = @Cadena_and + @NombreCampo + '=@' + @NombreCampo + ' AND '

Fetch Next From AutomaticTable Into @NombreCampo, @Tipo, @Tamanho

END

set  @Cadena_Insercion=SUBSTRING(@Cadena_Insercion,2,LEN(@Cadena_Insercion))
set  @Cadena_Variables=SUBSTRING(@Cadena_Variables,2,LEN(@Cadena_Variables))
set  @Cadena_Actualizacion=SUBSTRING(@Cadena_Actualizacion,1,LEN(@Cadena_Actualizacion)-1)
set  @Cadena_and=SUBSTRING(@Cadena_and,1,LEN(@Cadena_and)-4)

PRINT ' '
PRINT 'IF @ITRAN=1'
PRINT ' BEGIN'
PRINT '  SELECT '+@Cadena_Insercion+' FROM '+@TABLA+''
PRINT ' END'
PRINT ' '

PRINT 'IF @ITRAN=2'
PRINT ' BEGIN'
PRINT '  INSERT INTO '+@TABLA+'('+@Cadena_Insercion+') VALUES (' + @Cadena_Variables + ')'
PRINT ' END'
PRINT ' '

PRINT ' '
PRINT 'IF @ITRAN=3'
PRINT ' BEGIN'
PRINT '  UPDATE '+@TABLA+' SET ' +  @Cadena_Actualizacion + ' WHERE ' + @Cadena_and
PRINT ' END'
PRINT ' '

PRINT ' '
PRINT 'IF @ITRAN=4'
PRINT ' BEGIN'
PRINT '  DELETE '+@TABLA+' ' + ' WHERE ' + @Cadena_and
PRINT ' END'
PRINT ' '
PRINT 'END'

CLOSE AutomaticTable
DEALLOCATE AutomaticTable

Microsoft teams - Linux - Background

I'm sorry for my bad english, I'm learning. One problem of use Microsoft teams on linux is the background on webcam and share only o...