Scripts curiosos, para construir otros scripts

Posted by Miguel Egea | Posted in AntiCursores, Relacional | Posted on 03-02-2010

0

En algunas ocasiones tenemos que lanzar un query repetitivo para un monton de servidores o para un monton de tablas. Yo que soy bastante vago a la hora de hacer tareas repetitivas me he ido creando atajos y truquitos, que no son otra cosa. Os voy a poner un par de ejemplos que habréis de adaptar a vuestras necesidades.

El primero de los ejemplos muestra como ejecutar un script mediante SQL CMD para un conjunto de servidores. Primero suponemos que tenemos una tabla que contiene el nombre de esos servers, también supone que el usuario sa tiene el mismo password en todos, obviamente basta con sustituir sa por otro usuario que tenga permisos.
Si estos usuarios están en una tabla también es facil de adaptar.

use tempdb
go
create schema tuesquema
go
create table tuesquema.TuTablaConNombresDeServidor (server sysname)
go
insert into tuesquema.TuTablaConNombresDeServidor  values ('127.0.0.1'),('10.10.10.10\instancia')
go
select row_number() over (partition by server order by orden),* 
	from(
		select 0 orden,
			':connect '+ server + ' -U sa -P PasswordSA ' query,
				server 
		from tuesquema.tutablaconNombresdeservidor 
		union all
		select  1 orden,
			'if 0=(select count(*) from master.sys.syslogins where name=''tunuevousuario'')' query,
			server 
		from tuesquema.tutablaconNombresdeservidor 
		union all
		select 2, 
			'begin',server 
		from tuesquema.tutablaconNombresdeservidor 
		union all
		select 3,
			'  create login tunuevousuario with password=''ElPassword'';',
			server 
		from tuesquema.tutablaconNombresdeservidor 
		union all
		select 4,
			'  exec sp_Addsrvrolemember ''tunuevousuario'',''sysadmin'';',
			server 
		from tuesquema.tutablaconNombresdeservidor 
		union all
		select 5,
			' end',
			server 
		from tuesquema.tutablaconNombresdeservidor 
		union all
		select 6, 
				'else',
				server 
		from tuesquema.tutablaconNombresdeservidor 
		union all
		select 7,
			'  exec sp_password ''tunuevousuario'',@new=''ElPassword'';',
			server 
		from tuesquema.tutablaconNombresdeservidor
 ) a where not server is null order by 4,1

El resultado de la ejecución de este script será el que podeis ver a contiunación

Lo que habremos de hacer luego es copiar el resultado query y pegarlo en una nueva ventana de consulta, despues habremos de ir a Query->SQLCMD mode, de esta forma aparecerá la parte de connect en gris, lo que quiere indicar que esa operación se lanzará no como TSQL sino como administración, realmente lo que hará será conectarse al servidor que hemos indicado. En modo SQL CMD hay muchos más comandos, pero no son el objeto de este artículo. El resultado hecho esto es el que podeis ver en la siguiente figura.

El siguiente script servira para ejecutar un select count para cada una de las tablas en nuestro sistema.

select 'SELECT  ''['+Table_schema+'].['+table_name+']'' NombreDeTabla,count(*) FROM  ['  +
		TABLE_SCHEMA +'].[' +TABLE_NAME +'] UNION ALL ' 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

El resultado de la ejecución de esta consulta será el que veis en la siguiente imagen.

Despues basta con copiar esta query a una nueva ventana, quitar el último union all y añadir una cláusula para la ordenación, en mi caso pondría order by 2 desc, de forma que se ordenaría de tabla con mayor numero de filas a menos. El resultado en AdventureWorks2008 será el que veis en la última imagen del artículo

Por útimo decir que este comando haría algo parecido (que no igual), es un comando indocumentado llamado sp_foreachtable que tiene su gracia

exec SP_MSFOREACHTABLE 'SELECT ''?'', COUNT(*) FROM ?'

Disfrutad del código