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

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -