[Code] cómo ejecutar n veces el texto seleccionado en SSMS

Hoy escuchando a Eladio Rincon @erincon en una presentación, mostró un truco que quiero compartir por considerarlo muy práctico

Es posible ejectar una instrucción n veces en el Management Studio de una manera muy simple sin necesidad de escribir código para iteraciones solo hay que usar GO n (siendo n el número de veces que quiero ejecutar el bloque seleccionado)

 

Entonces por ejemplo

 

select 1

go 10 

 

Presentará 10 veces 1 (lo ejecuta individualmente 10 veces) los invito a probarlo

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

 

[Code] Al ejecutar en SSMS es más rápido que al crearlo como procedimiento almacenado

Un caso extraño y que sucede más a menudo de lo esperado es cuando un procedimiento almacenado tarda más en ejecutarse que al hacer el mismo ejercicio en el editor de consultas de SSMS, en este artículo presentaré una técnica aprendida recientemente

 

El tema está con los parámetros: cuando tengo un procedimiento con el siguiente esquema:

create procedure MiProcedimiento
@Valor1 int,
@Valor2 varchar(50),
@valor3 date
as
begin 

............

y dicho procedimiento tarda mucho tiempo y no tarda mucho menos en SSMS sugiero intentar lo siguiente:

create procedure MiProcedimiento
@Valor1 int,
@Valor2 varchar(50),
@valor3 date
as
begin 

declare 
@Valor1Interna int = @Valor1,
@Valor2Interna varchar(50) = @Valor2,
@valor3Interna date =@Valor3

--Cuerpo del procedimiento

End

En mi experiencia he encontrado que al aplicar este truco el rendimiento del procedimiento es el mismo que el encontrado en SSMS, declarar las variables internamente favorece el rendimiento, no es necesario hacerlo en todas las ocaciones, pero resuelve el problema planteado

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

 

[How to] Ver la fecha de creación y modificación de los procedimientos almacenados

Saludos, algunas veces, para hacer control de cambios es necesario cuando modificamos un procedimiento almacenado, para hacerlo, se puede usar la siguiente instrucción

 

SELECT name, create_date, modify_date 

FROM sys.objects

WHERE type = ‘P’ 

order by modify_date desc

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

 

[Code] Cómo convertir un archivo DataCollector .blg a CSV

Saludos

Al hacer dianóstico de Sql Server (y de cualquier otro sistema que implemente correctamente instrumentación) se recurre a los data collectors para diagnosticas nuestro sistema, los archivos que dicha operación generan tienen la extensión .blg, los cuales al intentar analizarlos nos encontramos con un problema, dado que son archivos binarios, para convertirlos a CSV se puede usar la herramienta RELOG, la documentación se puede encontrar aquí

Un ejemplo:

relog -f csv MiArchivo.blg -o MiArchivoSalida.csv

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

 

[Code] Cómo obtener el valor que retorna un procedimiento almacenado al usar sp_executesql

Saludos, al revisar la documentación oficial de sp_executesql observo que no se presenta la forma de obtener el valor devuelto por un procedimiento almacenado, aquí un ejemplo:

create procedure MiProcedimiento
as
Begin
return 2 --Valor arbitrario
End


declare @script nvarchar(4000)
declare @filasAfectadas int = 0

set @script = 'exec @filasAfectadas = MiProcedimiento'
exec sp_executesql @script, N'@filasAfectadas int output', @filasAfectadas=@filasAfectadas output

print @filasAfectadas 

Al ejecutar el script de ejemplo observamos que se obtiene el resultado del valor devuelto por el procedimiento, la parte clave es pasar una variable marcada con output para tener el resultado

 

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

[Code] ¿Cuál es el tipo de datos de NULL por defecto en una consulta?

Desarrollando un aplicativo me encontré con la curiosidad de saber cuál sería el tipo de datos de una columna en donde sólo se indicara:

select null as A

 

¿Cual es el tipo de datos de la columna A?

 

La respuesta es int, ¿cómo lo determiné?, usando la técnica descrita en el artículo [Code] Cómo conocer la estructura de una tabla temporal 

El código usado es el siguiente:

select null as A
into #t 

exec tempdb..sp_help #t

drop table #t

 

Para especificar un tipo de datos en particular debemos hacer un cast al NULL

select cast(null as bit) as A
into #t 

exec tempdb..sp_help #t

drop table #t

 

Espero sea de ayuda,

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP

 

[Code] Cómo visualizar la estructura de una tabla temporal

Hacer definiciones de tablas es siempre mas efectivo que generarlas dinámicamente, por lo que tomarse el trabajo de revisar campo a campo qué campos y cómo aplican a lo que queremos hacer puede tomar tiempo, aquí publico un ejemplo de como llevar los resultados a tabla temporal, ver su estructura para usar dicha información para generar una tabla (o variable tipo tabla) más rápidamente

;With Ejemplo as (
select 1 as b, 'valores' as c
union all
select 2 as b, 'Misvalores' as c)
select * 
into #t 
from Ejemplo

exec tempdb..sp_help #t

drop table #t

 

El ejemplo es simple pero imagine tener que varios miles de registros y tener que verificar campo a campo la longitud máxima de cada uno de ellos, el tipo de datos, etc.

Uno de los resultados de sp_help retorna

El cual con poco procesamiento podemos convertir en una tabla, tabla temporal o variable tipo tabla según lo requerido

La técnica mencionada solo se recomienda en entornos de desarrollo y no debe ser usada con precaución en tablas con gran cantidad de datos (una opción es limitar el número de registros de la tabla a devolver)

 

Espero sea de ayuda,

 

FREDDY LEANDO ANGARITA CASTELLANOS
Sql Server MVP