martes, 28 de febrero de 2012
Obtención del valor max de n registros
lunes, 28 de marzo de 2011
Hacer que un procedimiento espere
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
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
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
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
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
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.
jueves, 7 de mayo de 2009
With para tablas temporales
select * from consulta1
resultados:
ID CODIGO
--- ----------
1 32323
2 CODIGO 2
Una cosa curiosa, es que antes de esta instrucción la instruccion previa debe terminar con ';'.
viernes, 24 de abril de 2009
Parametros multiples con tsql (xml)
BEGIN
DECLARE @HDOC INT -- Puntero a la estructura xml
DECLARE @XML xml -- Xml en 2005, para 2000 seria una cadena de caracteres
SET @XML = 'xml' -- el xml de ejemplo
EXEC SP_XML_PREPAREDOCUMENT @HDOC OUTPUT, @XML -- preparamos el documento xml para procesarlo
SELECT * FROM OPENXML(@HDOC,'/ArrayOfInt/int',3) WITH (xint int 'text()')
-- lo procesamos fijarse en la clausula with donde se especifica la estructura de la tabla de destino
EXEC SP_XML_REMOVEDOCUMENT @HDOCEND -- Liberamos de memoria la preparación del documento
CASE EN TSQL
Por ejemplo imajinaros que queremos que en una consulta aparezca un semaforo dependiendo de una variable.
declare @campo1 intset @campo1 = 2
select case @campo1 when 1 then 'verde' when 2 then 'rojo' else 'naranja' end
jueves, 23 de abril de 2009
Uso de cursores
He de comentar que realmente he comprobado dicha frase, y es más también puedo decir que la diferencia entre usar cursores y es mucha, Sobre todo en cuanto a tiempo de proceso hablamos.
Pero menos rollo y vamos al tema:
- Primero lo declaramos, le daremos un nombre (para el ejemplo lo llamares cr1) y prepararemos la select que usaremos para seleccionar la información que queremos. DECLARE CR1 CURSOR LOCAL FOR SELECT CAMPO1,CAMPO2 FROM TABLA
- Fijaos que aunque usamos DECLARE, el nombre de la variable no lleva la arroba (@).
- Deberemos declarar las variables que usaremos para almacenar el valor de los campos. DECLARE @CAMPO1, @CAMPO2 INT
- Se declararan tantas variables como campos tengamos en la select.
- Ya podemos abrir el cursor OPEN CR1
- Y Movemos el cursor al primer registro, los valores los almacenaremos en las variables declaradas y el orden de los campos debe ser el mismo que en la select.
- FETCH NEXT FROM RS INTO @CAMPO1, @CAMPO2
- Ya podemos empezar el bucle de recorrido del cursor:
WHILE @@FETCH_STATUS = 0
BEGIN
PROCESOS ----
FETCH NEXT FROM CR1 INTO @CAMPO1, @CAMPO2
END
- No se debe olvidar de cerrar el cursor (CLOSE CR1) y liberar de la memoria el cursor (DEALLOCATE CR1).
El tema de cursores se puede complicar más, por ejemplo el @@fetch_status puede tener diferentes valores y el cursor se puede mover adelante y atrás. Pero esto lo explicare en otro artículo. ;)
miércoles, 22 de abril de 2009
Matrices en tsql
La utilización de cualquiera de estas dos opciones, dependerá de la necesidades del desarrollador.
No soy nada partidario de hacer tablas temporales físicas, así que de momento no os lo explicare ;) ya se... es que tengo mis manías.
Así que os explicare las tablas temporales, cuyo ciclo de vida solo corresponde a el procedimiento en curso.
- Primero declararemos la tabla, se declara igual que otras variables pero definiendo los campos de dicha tabla y se hará de la siguiente forma DECLARE @PRUEBA TABLA (CAMPO1 INT, CAMPO2 VARCHAR(20))
- Se usa exactamente igual que cualquier tabla fisica de base de datos, podemos hacer inserts, updates o deletes ej: INSERT INTO @PRUEBA (CAMPO1, CAMPO2) VALUES(1,'CAMPO') o SELECT * FROM @PRUEBA
- No es necesario destruir la tabla, como he comentado el ciclo de vida solo corresponde al procedimiento en curso.
Bases de tsql
Así mismo tsql es un gran desconocido, desconozco el porque pero no es habitual que se usen procedimientos en tsql, los desarrolladores que usan sql server harcodean las consultas dentro del código fuente (con el riesgo de seguridad que esto implica). Mientras que trabajar de la misma forma en oracle es casi imposible de ver.
Ya solo por pertenecer a Microsoft, sql server recibe criticas y comentarios discriminatorios. Entiendo la manía que en el mundo del desarrollo, se tiene a Microsoft pero bueno es lo que hay, el 99% de los ordenadores del mundo llevan instalado su sistema operativo, así que tan malo no sera ( al menos a nivel comercial). En mis años de experiencia con sql-server he quedado muy satisfecho con los resultados obtenidos y puedo decir que permite desarrollar software de una forma muy rápida y eficiente pese a quien pese.
En este blog iré insertando funciones y trucos aprendidos en mis años de trabajo , que espero os sean de utilidad, así mismo espero opiniones y comentarios así como aportaciones.