Here is a script for you. I rearranged your query, so that you will get all databases, even those that has never been backed up - that could be sort of interesting.
The TRY-CATCH is there to prevent that an error with an occasional server does not abort the entire script.
DECLARE @cur CURSOR,
@server sysname,
@sp_executesql nvarchar(200),
@query nvarchar(MAX)
DECLARE @rettable TABLE (servername sysname NOT NULL,
dbname sysname NOT NULL,
lastbackdate datetime NULL,
backuptype varchar(30) NULL,
PRIMARY KEY (servername, dbname)
)
SELECT @query =
'SELECT @@servername, databases.name,
MAX(backup_finish_date) AS last_db_backup_date,
case backupset.type
when ''D'' then ''Database''
when ''I'' then ''Differential database''
when ''L'' then ''Log''
when ''F'' then ''File or filegroup''
when ''G'' then ''Differential file''
when ''P'' then ''Partial''
when ''Q'' then ''Differential partial'' end as [Type]
FROM master.sys.databases
LEFT JOIN (msdb.dbo.backupmediafamily
JOIN msdb.dbo.backupset ON backupmediafamily.media_set_id = backupset.media_set_id)
ON databases.name = backupset.database_name
WHERE databases.state_desc = ''ONLINE''
GROUP BY databases.name, backupset.type
ORDER BY databases.name, backupset.type'
SET @cur = CURSOR STATIC FOR
SELECT name
FROM sys.servers
WHERE provider LIKE N'SQLNCLI%' OR
provider LIKE N'MSOLEDBSQL%' OR
provider = N'SQLOLEDB'
OPEN @cur
WHILE 1 = 1
BEGIN
FETCH @cur INTO @server
IF @@fetch_status <> 0
BREAK
SELECT @sp_executesql = quotename(@server) + '.master.sys.sp_executesql'
BEGIN TRY
INSERT @rettable(servername, dbname, lastbackdate, backuptype)
EXEC @sp_executesql @query
END TRY
BEGIN CATCH
PRINT 'Call to server ' + @server + ' failed with: ' + error_message()
END CATCH
END
SELECT * FROM @rettable