jueves, 25 de agosto de 2011

Intento de Expresiones Regulares en SQL Server

Aqui les dejo una simple funcion que valida una expression de acuerdo a un patron.

Create Function dbo.VerificarExpresion(@cadena as varchar(1000), @patron as varchar(100))
returns bit as
Begin
Declare @Len as int;
Declare @PatronBusqueda as varchar(8000);
Declare @Result as Int;

Select @Len = Len(@cadena);

While @Len>0
Begin
Select @PatronBusqueda = Isnull(@PatronBusqueda,'') + @patron;
Select @Len = @Len -1;
End
Select @Result = Case When @cadena Like @PatronBusqueda Then 1 Else 0 End;
Return @Result;
End
Go


y podemos testear :
-- verifica si en cadena estan letras comprendidas entre A y Z
select dbo.VerificarExpresion('cadena','[A-Z]')

-- verifica si 12345 está comprendido entre 0 y 9
select dbo.VerificarExpresion('12345','[0-9]')

-- verifica si la en a5ed estan ocurrencias del
select dbo.VerificarExpresion('a5ed','[a5ed]') patron a5ed


Hasta pronto

miércoles, 24 de agosto de 2011

Indices en SQL Server 2008 R2

Generalmente en nuestras tablitas creamos indices para un mejor rendimiento de nuestras querys, sin embargo algo curioso que sucede en tablas que tienen mas de 1 millon de registros es que los indices podrían ser perjudiciales en el caso explicito de eliminar. Vamos al grano, esta query construye la sentencia para deshabilitar los indices de una tabla.

declare @DisableQuery varchar(max) = ''
select @DisableQuery = COALESCE(@DisableQuery +'','')
+ 'alter index ' +i.name+ ' on ' +o.name+ ' disable '+ CHAR(13)+Char(10)+'; '
From sys.indexes i
Inner Join sys.objects o On o.object_id = i.object_id
Where o.is_ms_shipped = 0
and i.index_id >= 1 and i.is_primary_key = 0
and o.name = 'NombreDeMiTabla'
select @DisableQuery
exec(@DisableQuery)



posterior a esto podemos realizar la elminacion de miles de filas de nuestra tabla de mas de 1 millon de registros, luego la dejamos intacta como anteriormente estaba, habilitamos los indices.

declare @EnableQuery varchar(max) = ''
select @EnableQuery = COALESCE(@EnableQuery +'','')
+ 'alter index ' +i.name+ ' on ' +o.name+ ' rebuild '+ CHAR(13)+Char(10)+'; '
From sys.indexes i
Inner Join sys.objects o On o.object_id = i.object_id
Where o.is_ms_shipped = 0
and i.index_id >= 1 and i.is_primary_key = 0
and o.name = 'NombreDeMiTabla'
select @EnableQuery
exec(@EnableQuery)