T4: Generador de Procedimientos Almacenados SQL

T4 (Text Template Transformation Toolkit) es una herramienta de Visual Studio que permite generar  código (C#, VB, SQL, etc) desde diferentes fuentes.

Como verán, el código se parece a ASP.Net o PHP, ya que el código de mezcla con la salida (ASP/HTML, PHP/HTML).

En este ejemplo, me conecto al SQL a través de Microsoft.SqlServer.Management, para extraer metadata de una base de datos específica a fin de generar procedimientos almacenados básicos (CRUD) para todas las tablas del modelo.

Esto permite ahorrar mucho tiempo en tareas repetitivas. Obviamente, este código luego deberá ser optimizado según sea necesario.

A continuación el código.

Archivo principal:

<#@ include file="Generico.tt" #>

USE <#= dbName #>;
GO
<#

foreach (Table table in database.Tables)
{
if (table.Name.StartsWith("SEG_")) continue;
if (table.Name.StartsWith("CC_")) continue;
if (table.Name.StartsWith("sysdiagrams")) continue;
table.Refresh();
#>

IF OBJECT_ID('[dbo].[<#= _prefijoProcedimiento #><#= table.Name #>_<#= _operacionS #>]') IS NOT NULL
BEGIN
DROP PROC [dbo].[<#= _prefijoProcedimiento #><#= table.Name #>_<#= _operacionS #>]
END
GO
--EXEC [dbo].[<#= _prefijoProcedimiento #><#= table.Name #>_<#= _operacionS #>]
/****** Object:  StoredProcedure [dbo].[<#= _prefijoProcedimiento #><#= table.Name #>_<#= _operacionS #>]    Script Date: <#= DateTime.Now.ToString()#> ******/
CREATE PROCEDURE [dbo].[<#= _prefijoProcedimiento #><#= table.Name #>_<#= _operacionS #>]
<#
PushIndent("    ");
int parametros=0;
foreach (Column column in table.Columns)
{
if (column.InPrimaryKey)
{
if (parametros==0)
{
WriteLine(_prefijoParametro + column.Name + " " + column.DataType.Name + " = NULL");
}
else
{
WriteLine("," +_prefijoParametro + column.Name + " " + column.DataType.Name  + " = NULL");
}
parametros++;
}
}
PopIndent();
#>
AS
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRAN
SELECT
<#
PushIndent("        ");
parametros=0;
foreach (Column column in table.Columns)
{
if (parametros==0)
{
WriteLine(column.Name);
}
else
{
WriteLine("," + column.Name);
}
parametros++;
}
PopIndent();
#>
FROM
<#= table.Name #>
WHERE
<#
PushIndent("        ");
parametros=0;
foreach (Column column in table.Columns)
{
if (column.InPrimaryKey)
{
if (parametros==0)
{
WriteLine( "(" + column.Name + " = " + _prefijoParametro + column.Name + " OR " + _prefijoParametro + column.Name + " IS NULL" + ")");
}
else
{
WriteLine("AND " + "(" + column.Name + " = " + _prefijoParametro + column.Name + " OR " + _prefijoParametro + column.Name + " IS NULL" + ")");
}
parametros++;
}

}
PopIndent();
PushIndent("    ");
WriteLine("COMMIT");
PopIndent();
WriteLine("GO");
}
#>

Archivo incluido:

<#@ template language="C#" hostspecific="true" #>
<#@ output extension="SQL" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#
    //string serverName = "SERVER\\INSTANCE";
    string serverName = ".";

    string _operacionU ="ACTUALIZAR";
    string _operacionI ="INSERTAR";
    string _operacionD ="ELIMINAR";
    string _operacionS ="SELECCIONAR";
    string _operacionLP ="LISTAR_PAGINADO";
    string _pageIndex="@P_PAGEINDEX";
    string _pageSize="@P_PAGESIZE";

    string dbName = "GRAFISMART";
    string _prefijoParametro = "@P_";
    string _prefijoProcedimiento = "PA_";
    //String sqlServerLogin = username";
    //String password = "password";
    Server server = new Server(serverName);
    Database database = new Database(server, dbName);
    database.Tables.Refresh();
#>

Parte del código generado:

 

USE GRAFISMART;
GO

IF OBJECT_ID('[dbo].[PA_ALM_ALMACEN_SELECCIONAR]') IS NOT NULL
BEGIN
DROP PROC [dbo].[PA_ALM_ALMACEN_SELECCIONAR]
END
GO
--EXEC [dbo].[PA_ALM_ALMACEN_SELECCIONAR]
/****** Object:  StoredProcedure [dbo].[PA_ALM_ALMACEN_SELECCIONAR]    Script Date: 18/11/2011 12:46:26 p.m. ******/
CREATE PROCEDURE [dbo].[PA_ALM_ALMACEN_SELECCIONAR]
@P_ID_ALMACEN bigint = NULL
AS
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRAN
SELECT
ID_ALMACEN
,NOMBRE
,ID_LOCAL
,ID_ALMACEN_PADRE
,ID_EMPRESA
,ESTADO_REG
,FECHA_REG
,IP_REG
,ID_USUARIO_REG
,FECHA_UPD
,IP_UPD
,ID_USUARIO_UPD
,ESTADO_ENT
FROM
ALM_ALMACEN
WHERE
(ID_ALMACEN = @P_ID_ALMACEN OR @P_ID_ALMACEN IS NULL)
COMMIT
GO

Descargue el código de ejemplo aquí.

Referencias:

T4: Text Template Transformation Toolkit

Code Generation and T4 Text Templates
T4 (Text Template Transformation Toolkit) Code Generation – Best Kept Visual Studio Secret

Mono’s Text Template Transformation Toolkit (T4)

LINQ to SQL templates for T4

Existing T4 database helpers for DB schema retrieval

T4 template to dump basic database schema in a static class…

About these ads

One response to this post.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 77 seguidores

A %d blogueros les gusta esto: