sql server - UNION in Dynamic SQL - TSQL -
the purpose of below script gather sum total of database sizes , number of databases each server , sum grand total.
declare @linkedserver varchar(100) declare @sql1 nvarchar(max) declare @sql2 nvarchar(max) declare @totaldb nvarchar(1000) declare @totalsize nvarchar(1000) declare @linespace varchar(100) declare @union1 varchar(200) declare @union2 varchar(200) select @linkedserver = min(name) serverwithlinkedservers.master.sys.servers name in ('servername1', 'servername2', 'servername3') while @linkedserver not null begin set @totaldb = 'select count(*) [total retailer databases] '+ @linkedserver +'.master.sys.databases'; set @union1 = @totaldb + ' union ' + @totaldb; set @totalsize = 'select cast(sum(size) * 8.00 / 1024.00 / 1024.00 decimal(9,2)) [total size gb] '+ @linkedserver +'.master.sys.master_files'; set @union2 = @totalsize + ' union ' + @totalsize; exec (@union1); exec (@union2); select @linkedserver = min(name) serverwithlinkedservers.master.sys.servers name in ('servername1', 'servername2', 'servername3') , name > @linkedserver end print @union1 print @union2 however, when execute code getting error stating:
unclosed quotation mark after character string 't'. incorrect syntax near 't'. what missing? or doing wrong?
here how can leverage dynamic sql kind of thing without using loop. rewrote queries single query each database. return number of databases on each server , total amount of space used files. suggest tweaking little bit exclude databases master, tempdb, model etc...
this still return entire list no need looping. once comfortable dynamic sql generates can comment out line , uncomment exec line.
declare @sql nvarchar(max) = '' select @sql = @sql + 'select count(distinct d.database_id) totalretailerdatabases , cast(sum(size) * 8.00 / 1024.00 / 1024.00 decimal(9,2)) totalsizegb ' + name + '.sys.master_files mf join ' + name + '.master.sys.databases d on d.database_id = mf.database_id union ' serverwithlinkedservers.master.sys.servers name in ( 'servername1' , 'servername2' , 'servername3' ) set @sql = left(@sql, len(@sql) - 10) --remove last union select @sql --exec sp_executesql @sql1
Comments
Post a Comment