martes, 28 de febrero de 2012

Obtención del valor max de n registros

Un ejemplo de como obtener el valor maximo dentro de los valores almacenados en n registros:

CREATE TABLE #t( a INT, b INT, c INT);

INSERT #t VALUES (9,8,7),(14,12,NULL),
(55, 31, 12),(53, NULL, 24),(NULL, 39, 47) ;
SELECT
( SELECT MAX(val)
FROM (VALUES (a)
, (b)
, (c)
) AS value(val)
) AS MaxVal
FROM #t ORDER BY a DESC;

lunes, 28 de marzo de 2011

Hacer que un procedimiento espere

Para que un procedimiento o un codigo tsql se espere un tiempo o bien espere a una hora determinada para continuar:

waitfor time '12:00:00' ( no continuara hasta la hora indicada)
waitfor delay '00:00:01' (esperara un segundo a continuar)

martes, 22 de marzo de 2011

Obtener información procedimientos

Habitualmente me surge la necesidad, de comparar los procedimientos existentes en varios entornos de una misma base de datos. Hemos subido a producción ese procedimiento? como puede ser que el mismo procedimiento en dos entornos diferentes produzca error ?.

A todos esto encontré solución con el TOAD para SQL SERVER, esta aplicación incorpora una utilidad "schema compare". Hasta aquí genial... salvo el momento de migrar a 2008 ups la versión que tengo de TOAD no me vale, como lo soluciono? compro una nueva versión?

La verdad es que siempre he sido partidario de tener mis propias utilidades (es lo que tiene ser programador ;) ), así que necesitaba obtener de alguna forma el código tsql de los procedimientos almacenados en mi bdd, para compararlos con los del otro entorno. De esta necesidad he encontrado la siguiente consulta :

SELECT *
FROM sys.sql_modules
JOIN sys.objects ON sys.sql_modules.object_id = sys.objects.object_id AND TYPE = 'P';


El resultado incluye todas las propiedades necesarias para realizar esta validación. El código incluido, el nombre, la fecha de alta, la de última modificación etc etc...

Francamente muy útil.

lunes, 10 de enero de 2011

Horizontalizacion con separadores

Permite convertir registros de múltiples filas en un solo campo con separadores.

SET NOCOUNT ON
DECLARE @listValues VARCHAR(8000)
DECLARE @delimeter VARCHAR(3)
SET @delimeter = ' ; '

CREATE TABLE #Table1 (FirstName varchar(10))
INSERT #Table1 VALUES ('Michiel')
INSERT #Table1 VALUES ('John')
INSERT #Table1 VALUES ('Smith')
INSERT #Table1 VALUES ('Peter')

SELECT @listValues = ISNULL(
@listValues + @delimeter + CAST(FirstName AS VARCHAR(8000)),
CAST(FirstName AS VARCHAR(8000))
)
FROM #Table1
ORDER BY FirstName

DROP TABLE #Table1

SELECT list = @listValues

lunes, 23 de agosto de 2010

Debugar asp.net

Recientemente he tenido un problema en el momento de debugar aplicaciones asp.net, y es que si bien me permitia ejecutar no se detenia en los puntos de debugación marcados. La solución a este problema es la siguiente :

1.Abre el Editor de Registro (Inicio / Ejecutar / Regedit.exe)

2.Navegue hasta la clave: HKEY_LOCALMACHINE / SOFTWARE / Microsoft / Internet Explorer / Main

3.Dentro de esa clave, agregue un Valor DWORD de nombre TabProcGrowth (Dentro de la clave haga clic derecho, seleccione la opción Nuevo y luego Valor DWORD)

4.Finalmente haga doble clic en el valor creado y establezca su valor en 0 (cero).

5.Cierre el Editor de Registro.

miércoles, 28 de octubre de 2009

with Recompile

Desde hacia días detectaba un procedimiento con un extraño comportamiento, el rendimiento de la consulta era inferior a la ejecución de la consulta directamente. ¿Como puede ser esto?

Como siempre en estos casos recurrí a los foros de internet, rápidamente obtuve una respuesta "parameter sniffing".

Resulta que una de las subconsultas del procedimiento se obtenía de una función que devolvía una tabla, y en este caso no se calcula correctamente el plan de ejecución. Asi que si no se recompila el procedimiento el rendimiento es deficiente, para subsanar este problema se puede añadir la clausula with recompile, obligando a sql-server a preparar cada vez un nuevo plan de ejecución.

El uso de la clausula es como sigue:

create proc dbo.prueba
@id int
with recompile
as
select * from tabla where id = @id

miércoles, 13 de mayo de 2009

Quitar hora a la fecha en tsql

Función para eliminar la parte de hora en una fecha.

ALTER FUNCTION [dbo].[f_fechaCadena] (@fecha datetime)
returns varchar(15)
as
begin
declare @fechaStr varchar(15)
set @fechastr = CONVERT(VARCHAR,@FECHA,103)
return @fechaStr
end

Convert con la clausula 103, elimina la parte de hora de una fecha en sql-server.