SQL Server - Lanzar scripts sql hacia multiples SQL DBs

 
Vista:

Lanzar scripts sql hacia multiples SQL DBs

Publicado por Diego (2 intervenciones) el 18/05/2016 11:59:45
Hola, actualmente usamos el SQL MultiScript para lanzar un Script a todas las bases de datos que manejamos, pero queremos automatizarlo un poco y quería saber si ésto mismo se puede hacer mediante consola, y como.
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Lanzar scripts sql hacia multiples SQL DBs

Publicado por Isaias (4558 intervenciones) el 18/05/2016 19:23:31
Sin con POWERSHELL

1) Create a folder D:\ExecScriptOnMultiServer
2) Create a .txt and write down all your SQL Instance name like below..
SQLInstanceName1
SQLInstanceName2
SQLInstanceName3
Save the txt file in safe location. D:\ExecScriptOnMultiServer\ServerList.txt
3) Save the powershell script in folder "D:\ExecScriptOnMultiServer\ExecuteQueryOnMultiServers.ps1"
4) Create a .sql file and write a SQL script in it which you want to run on all servers mentioned in ServerList text file.
Save the SQL script in location. D:\ExecScriptOnMultiServer\SQLQuery.sql
For Example.. suppose here I want to extract version, edition, SP and cluster node information for some of the servers, so i will write below SQL script in file "SQLQuery.sql"


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
declare @Nodes Varchar(100)
set @Nodes=''
 if (SERVERPROPERTY('IsClustered') = 1)
begin
select @Nodes=@Nodes+ NodeName
+',' from sys.dm_os_cluster_nodes order by NodeName
set @Nodes=substring(@Nodes,0,LEN(@Nodes))
select
@Nodes as HostName,
SQLInstanceName = @@SERVERNAME,
'Yes' as IsClustered,
CAST(SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS VARCHAR(50)) As ActiveNode,
SERVERPROPERTY('edition') As SQLEdition,
Case
  when cast(serverproperty('productversion') as varchar) like '8.%' then 'SQL2000'
       when cast(serverproperty('productversion') as varchar) like '9.%' then 'SQL2005'
       when cast(serverproperty('productversion') as varchar)  like '10.0%' then 'SQL2008'
       when cast(serverproperty('productversion') as varchar)  like '10.50.%' then 'SQL2008R2'
       when cast(serverproperty('productversion') as varchar)  like '11.%' then 'SQL2012'
  when cast(serverproperty('productversion') as varchar)  like '12.%' then 'SQL2014'
       ELSE 'SQL7.0' END +' '+
  cast(SERVERPROPERTY('productlevel') as varchar(50))+' ('+ cast(SERVERPROPERTY('productversion') as varchar(50)) + ')' as SQLVersion
end
 else
begin
select @Nodes=CAST(SERVERPROPERTY('ComputerNamePhysicalNetBIOS') AS VARCHAR(50))
select
@Nodes as HostName,
SQLInstanceName = @@SERVERNAME,
'No' as IsClustered,
SERVERPROPERTY('edition') As SQLEdition,
Case
  when cast(serverproperty('productversion') as varchar) like '8.%' then 'SQL2000'
       when cast(serverproperty('productversion') as varchar) like '9.%' then 'SQL2005'
       when cast(serverproperty('productversion') as varchar)  like '10.0%' then 'SQL2008'
       when cast(serverproperty('productversion') as varchar)  like '10.50.%' then 'SQL2008R2'
       when cast(serverproperty('productversion') as varchar)  like '11.%' then 'SQL2012'
  when cast(serverproperty('productversion') as varchar)  like '12.%' then 'SQL2014'
       ELSE 'SQL7.0' END +' '+
  cast(SERVERPROPERTY('productlevel') as varchar(50))+' ('+ cast(SERVERPROPERTY('productversion') as varchar(50)) + ')' as SQLVersion
end  
##Save the below powershell script in folder "D:\ExecScriptOnMultiServer\ExecuteQueryOnMultiServers.ps1"
 
$QueryPath= "D:\ExecScriptOnMultiServer\SQLQuery.sql"
$OutputFile = "D:\ExecScriptOnMultiServer\QueryOutput.txt"
 
$ExecuteQuery= Get-Content -path $QueryPath | out-string
 
"Results -- > `r`n`r`n" > $OutputFile
 
FOREACH($server in GC "D:\ExecScriptOnMultiServer\ServerList.txt")
 {
	$server
 
	"---------------------------------------------------------------------------------------------------------" >> $OutputFile
	$server >> $OutputFile
	"---------------------------------------------------------------------------------------------------------" >> $OutputFile
	invoke-sqlcmd -ServerInstance $server -query $ExecuteQuery -querytimeout 65534 | ft -autosize | out-string -width 4096 >> $OutputFile
 }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lanzar scripts sql hacia multiples SQL DBs

Publicado por Diego (2 intervenciones) el 19/05/2016 16:52:28
Muchas gracias, y a ver si sabe alguien de esto.
Como dije usamos el SQLMultiScript, y tenemos una lista de bases de datos en la que se van añadiendo nuevas bases de datos cuando un cliente se nos une.
Sabe alguien si desde la linea de comandos se puede añadir una nueva base de datos a es alista que usamos para lanzar los scripts?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Lanzar scripts sql hacia multiples SQL DBs

Publicado por Isaias (4558 intervenciones) el 19/05/2016 17:24:53
Si, con SQLCMD.EXE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar