jueves, 28 de febrero de 2008

Evitar el uso del cursor

Una de las recomendaciones más tópicas a la hora de escribir scripts en T-SQL es la de eliminar el empleo de cursores siempre que sea posible.

Brad McGehee en sql-server-performance.com habla del tema. Y aunque menciona el uso de WHILE como alternativa al cursor no pone ningún modelo como ejemplo

Aquí va uno sencillo (simplemente toma los nombres de todas las bbdd del servidor y los muestra )

declare @loop int

create table #test (clave int identity(1,1) not null, dbname varchar (60))

insert into #test select name from master..sysdatabases

SET @loop = isnull((SELECT count(*) FROM #test),0)

SET @counter= 1

WHILE @loop >0 and @counter <=@loop

BEGIN

SELECT @dbname = rtrim(dbname) FROM #test

WHERE clave = @counter

print @dbname

SET @counter = @counter +1

END

Select * from #test

DROP TABLE #test

El mismo ejemplo pero usando cursor sería algo así:

declare @counter int

declare @dbname varchar (60)

create table #testcur (dbname varchar (60))

insert into #testcur select name from master..sysdatabases

declare dbcursor cursor for select dbname from #testcur

open dbcursor

fetch next from dbcursor into @dbname

while @@fetch_status = 0

begin

print @dbname

fetch next from dbcursor into @dbname

end

close dbcursor

deallocate dbcursor

drop table #testcur

jueves, 21 de febrero de 2008

Generardor de Passwords

¿Cansados de tener que pensar passwords seguras? PcTools las generará por vosotros, en linea o descargando la herramienta en vuestro pc. Echarle un vistazo además a otros productos; hay herramientas, de pago y freeware, muy interesantes

miércoles, 20 de febrero de 2008

SQL Server 2008 CPT

Sale a la luz el que probablemente sea último CPT (Community Technology Preview) de SQL Server 2008. Aquí para descargarlo.

El fichero de 1.4 Gb incluye quince novedades con respecto a vesiones previas del 2008 como SQl Audit, compresión de datos o índices filtrados

Y un reto: si descubres un bug puedes ganar una Xbox

miércoles, 13 de febrero de 2008

Ejecutar a la vez un mismo script en varias instancias

El pasado viernes, os puse un ejemplo de cómo correr una misma consulta en varios servidores y presentar todos los resultados en un mismo archivo de texto. Os ponía en el ejmplo un sencillo script para monitorizar el estado de la tempdb.

A continuación tenéis otro ejemplo, esta vez en perl. El script crea una carpeta con la fecha presente y en ella por cada instancia consultada crea un archivo de texto.

En mi caso, empleo este script para la monitorización diaria de logs entre otros.

#!perl

#---------------------------------------------------------

#--GETTING DATES FROM WHICH LOGS WILL BE WRITTEN

#---------------------------------------------------------

#--gets dates:current & day before to grep those entries

#--from the log file generated

#--gets date to delete seven days old rpts

use Time::localtime;

#-- get dates

#$tm = localtime(time - (86400)); #for day before

$tp = localtime; #for current

#$td = localtime(time - (604800)) ; # seven days ago

#--for each date, two different formats: yyyy-mm-dd -> SQL 7, 2k, 2005

#--yyyy/mm/dd -> SQL 6.5

#-- & eliminate possible blank spaces

$variable= sprintf("%04d-%02d-%02d\n", $tp->year+1900, ($tp->mon)+1, $tp->mday);

$variable=~s/\s//g;

$report = "script.sql";

#-----------------------------------------------

#--MAKE DIRECTORY WHERE RPTS WILL BE PLACED

#-----------------------------------------------

$directory ="$variable";

system("mkdir $directory");

@todo = (

'servidor1',

'servidor1\instancia1',

);

system( "del $directory\\*.log");

foreach (@todo) {

#--assign scalar value server

$server=$_; # server name itself

$output=$_; # since win cannot create files with "\"...

$output=~s/\\/X/; #...remove backslash and replace it for "X"

#--remove spaces

$server=~s/\s//g;

$output=~s/\s//g;

system("osql -E -S $server -t60 -n -w1000 -i $report -o $directory\\$output.log");

}

#--END

Podéis copiar el ejemplo en un archivo y salvarlo con extensión pl. Si estáis interesados en cómo usar perl con SQLl Server os recomiendo este libro

martes, 12 de febrero de 2008

Versiones de Microsoft SQL Server 2008, 2005, 2000 y 7.0

Microsoft (¡por fin!) desde el 19 de diciembre incluye un documento con los distntas versiones (parches, actualizaciones, etc) de Sql Server desde el lanzamiento del SP2

Se echa de menos un documento más extenso que incluya versiones anteriores. Por suerte para nosotros, alguien se dedica a recopilar toda esa información. Os recomiendo salvar este enlace en favoritos

viernes, 8 de febrero de 2008

Comprobar el estado de la Tempdb en varios servidores

Una buena solución para correr un script en varios servidores es usar OSQL dentro de un batch file u otro lenguaje script

Por ejemplo, supongamos que queremos ver el estatus de la tempdb en una serie de servidores y queremos que todos los resultados aparezcan en un archivo de texto que llamo jobstatus.txt y que presenta el siguiente formato:

Fri 02/08/2008

09:41 AM

*****************************************************************

TEMPDB STATUS

*****************************************************************

Server Name DB Name DB Size Mb Space Used Mb

Servidor1 Tempdb 3316.44 0.55

Server Name DB Name DB Size Mb Space Used Mb

Servidor2 Tempdb 150.00 0.70

Server Name DB Name DB Size Mb Space Used Mb

Servidor3 Tempdb 65.56 0.59

Para ello crearemos en este caso un batch file en el cual incluiremos la lista de servidores a auditar y una línea OSQL (consultar la ayuda en línea acerca de esta utilidad para ver opciones de salida)

En primer lugar creamos el script que queremos correr y lo salvamos con extensión *.sql

set nocount on

declare @dbsize dec(15,2)

declare @database_size nvarchar(13)

declare @spaceused nvarchar(13)

select @dbsize = sum(convert(dec(15,2),size))

from tempdb.dbo.sysfiles

select @database_size =(convert(dec(15,2),@dbsize / 128)),

@spaceused=(select convert(dec (15,2),(sum(convert(dec(15,2),reserved))/128))

from tempdb..sysindexes

where indid in (0, 1, 255))

select convert(nvarchar(30),@@servername) as 'Server Name','Tempdb' as 'DB Name',

@database_size as 'DB Size Mb', @spaceused as 'Space Used Mb'

set nocount off

A continuación, necesitamos el batch file:

date /t >>jobstatus.txt

time /t >>jobstatus.txt

echo *****************************************************************>> jobstatus.txt

echo TEMPDB STATUS >>JOBSTATUS.TXT

echo *****************************************************************>>jobstatus.txt

::Aquí tenemos los servidores.

for %%t in (

servidor1

servidor2

servidor3

) do osql -E -S %%t -t30 -n -w500 -i TEMPDB.sql >> jobstatus.txt

echo ------------------------------------------------------->> jobstatus.txt

echo ------------------------------------------------------->> jobstatus.txt

echo END OF REPORT

::si queremos que automáticamente se nos abra el fichero

notepad jobstatus.txt

Salvamos con extensión *.bat. Para ejecutar, ya sabéis doble click o bien podéis programarlo como un job (aseguraros que la cuenta que lo ejecuta tiene permisos en cada uno de los servidores).

El próximo día os pondré otro ejemplo, esta vez utilizando perl, salvando un fichero para cada servidor.

jueves, 7 de febrero de 2008

SQL Server 2005 Informes de Rendimiento

SP2 introduce una nueva utilidad llamada "Custom Reports" la cual nos permite crear informes personalizados a partir de Reporting Services para ser visualizados desde el Management Studio. Aprovechando esta nueva funcionalidad, una herramienta muy, muy interesante es el SQLServer2005_PerformanceDashboard.

En la imagen siguiente podéis ver el aspecto que tiene:




Este conjunto de informes creados por Keith Elmore (ingeniero de soporte de Micorosoft)utiliza sólo las Dynamic Management Views and los Catalog Views ( no alamacena datos ni tampoco usa los contadores de Windows)
La instalación es bastante sencilla; bajaros el paquete msi desde el primer enlace. Correr el ejecutable, seleccionar dónde queréis guardar los informes. Una vez extraidos los ficheros, deberéis correr un script sql que creará una serie de funciones y procedimientos almacenados en MSDB que serán los encargados de generar el informe. De todas formas, en el siguiente enlace tenéis paso a paso las instrucciones de instalación

Conviene echarle un vistazo al blog SQL Server Manageability Team en el cual aparece la resolución de algunos problemas y errores que pudieráis encontrar


miércoles, 6 de febrero de 2008

Traza habilitada por defecto en SQL Server 2005

Por defecto, SQL 2005 activa una traza que captura eventos tales como auditar usuarios, objetos, inicio-parada de servidor, etc La siguiente sentencia devuelve los eventos (número y descripción) que captura la traza:

SELECT DISTINCT a.eventid, b.name
FROM fn_trace_geteventinfo(1) a
JOIN sys.trace_events b
ON a.eventid = b.trace_event_id

La traza está configurada para no crear archivos más grandes de 20Mb. Estos archivos se encuentran situados en el directorio de SQL (C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG por defecto)

Si corréis select * from ::fn_trace_getinfo(default) os dará información acerca del directorio, tamaño etc.

Managment Studio utiliza esta traza para generar sus informes, pero si queréis visualizar los datos caputrados, directamente con el profiler se puede abrir (simplemente doble click en el archivo trc que queráis, o bien podéis importarlo a una tabla:
use tudb
SELECT * INTO temp_trc FROM fn_trace_gettable('c:\temp\my_trace.trc', default) -- dir de la traza
GO

La ayuda en linea ofrece
información sobre esta traza

Y en este blog podéis encontrar un interesante análisis sobre el impacto en el servidor de esta y del db page checksum traza

martes, 5 de febrero de 2008

Actualización para SQL Server 2005 SP2

Con fecha 30 de Enero, Microsoft ha publicado un paquete de actualizaciones del SP2
Aunque la lista de 'bugs' que corrige es enorme, Microsoft no recomienda la actualización a menos que se sufra alguno de los problemas descritos en el KB . Para conseguir este conjunto de actualizaciones, debe contactarse con el servico de soporte de Microsoft.

lunes, 4 de febrero de 2008

Cambio de sintaxis en los SQL Agent Tokens

A partir de SP1 los tokens incluidos en trabajos necesitan macros de escape. Si intentáis lanzar el trabajo que incluya tokens aparece´ra el siguiente error :


The job step contains one or more tokens. For SQL Server 2005 Service Pack 1 or later versions, all job steps with tokens must be updated with a macro before the job can run.


En el KB 915845 tenéis más detalles

Así pues, en vez de $(A-MSG) vendría a ser algo como $(ESCAPE_NONE(A-MSG)

Otroo ejemplo; por ejemplo utilizáis

SET @err =REPLACE("$(A-MSG)", '''','')

Debería ser cambiado a

SET @err ='$(ESCAPE_SQUOTE(A-MSG))'

Para compensar en parte el engorro de este cambio Microsoft facilita un sp (sp_AddEscapeNoneToJobStepTokens )que automáticamente adapta los trabajos existentes a la nueva sintaxis. Como su nombre indica, sólo añada el macro de Escape_None, ojo

El script lo tenéis hacia el final en el KB arriba indicado