miércoles, 23 de abril de 2008

Funciones C# en SQL Server 2005

Hola:

Si no te alcanza con las funciones que te da SQL Server 2005 para realizar alguna consulta podes hacer lo siguiente
  1. Crear un proyecto biblioteca de clases (.Net 2.0 )
  2. Crear la funcion que necesitas con el algoritmo complicado
  3. adicionar la biblioteca a la base de datos
  4. llamar la funcion desde la consulta como cualquier funcion incorporada SQL
Ejemplo:

una función para separar el campo "gbagenomb" (nombre del cliente) en primer nombre, apellido y segundo apellido y otra para mostrar el nombre de manera capitalizada (solo la primera mayuscula)

las funciones en C# serían algo como:

public class StringFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static string Capitalize(string value )
{

if (value != null)
{
if (value.Length == 0)
return value;

StringBuilder result = new StringBuilder(value);
result[0] = char.ToUpper(result[0]);
for (int i = 1; i <>
{
if (char.IsWhiteSpace(result[i - 1]))
result[i] = char.ToUpper(result[i]);
else
result[i] = char.ToLower(result[i]);
}
String res = result.ToString().Trim();
if (res.EndsWith("De"))
{
result.Replace("De", "de", res.Length - 2, 2);
res = result.ToString().Trim();

}
return res;
}
else
return null;
}
[Microsoft.SqlServer.Server.SqlFunction]
public static string NamePart(string value, int part)
{

if (value != null)
{
if (value.Length == 0)
return value;
List nameParts = new List();
value = value.Trim();
StringBuilder result = new StringBuilder();

for (int i = 0; i <>
{
if (char.IsWhiteSpace(value[i]))
{
if (result.ToString().Trim() != "")
{
nameParts.Add(result.ToString());
result = new StringBuilder();
}
}
else
result.Append(value[i]);
}
if (result.ToString().Trim() != "")
nameParts.Add(result.ToString());
if (part <>
return nameParts[part];
return "";

}
else
return null;
}

}

una vez compilamos y obtenemos la dll simplemente copiamos este archivo a un compartido del servidor de base de datos

ahora para incluir la biblioteca y registrar las nuevas funciones ejecutamos (ojo con coincidir el namespace de las funciones):

CREATE ASSEMBLY [bga]
AUTHORIZATION [dbo]
FROM 'E:\sergio\BGASqlFunctions.dll'
WITH PERMISSION_SET = SAFE

GO
CREATE Function Capitalize(@Cadena NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
EXTERNAL NAME bga.StringFunctions.Capitalize

GO
CREATE Function NamePart(@Cadena NVARCHAR(MAX), @Part int)
RETURNS NVARCHAR(MAX)
EXTERNAL NAME bga.StringFunctions.NamePart



Listo! ahora una consulta para probar las nuevas funciones:

Select dbo.Capitalize(gbagenomb) as nombreCompleto,
dbo.Capitalize(dbo.NamePart(gbagenomb,2) +' '+ dbo.NamePart(gbagenomb,3)) AS nombre,
dbo.Capitalize(dbo.NamePart(gbagenomb,0)) AS ape1,
dbo.Capitalize(dbo.NamePart(gbagenomb,1)) AS ape2
FROM GBAGE

resultado:
Mendoza Escalante Gustavo Gustavo Mendoza Escalante
Paz Rea Jaime Eduardo Jaime Eduardo Paz Rea
Antelo Salmon Luis Fernando Luis Fernando Antelo Salmon
Ballivian Cordova Jerges Jerges Ballivian Cordova
Matadero Frigorifico Santa Cruz S.a. Santa Cruz Matadero Frigorifico
Ardaya Vaca Luis Luis Ardaya Vaca
Pena Gutierrez Edgar Alan Edgar Alan Pena Gutierrez
Pena Carmen Hasbun de Hasbun de Pena Carmen


No hay comentarios: