SQL Server – How to Exclude tempdb from sp_MSforeachdb

backupsql server 2014stored-procedurestempdb

Below I have a code to get info about t-log backups for each database in the server. I want to exclude tempdb from this list.

exec sp_MSforeachdb 'SELECT server_name, sysdb.name AS DatabaseName, bkup.user_name AS [User],
ceiling(bkup.backup_size /1048576) as ''Size Meg'' ,
cast((bkup.backup_size /1073741824) as decimal (9,2)) as ''Gig'',
bkup.backup_start_date AS [Backup Started],
bkup.backup_finish_date AS [Backup Finished (Last BackUp Time)],
CAST((CAST(DATEDIFF(s, bkup.backup_start_date, bkup.backup_finish_date) AS int))/3600 AS varchar) + '' hours, ''
+ CAST(DATEDIFF(mi, bkup.backup_start_date, bkup.backup_finish_date) - (DATEDIFF(mi, bkup.backup_start_date, bkup.backup_finish_date)/60)*60 AS varchar) + '' minutes, ''
+ CAST((CAST(DATEDIFF(s, bkup.backup_start_date, bkup.backup_finish_date) AS int))%60 AS varchar)+ '' seconds'' AS [Total Time]
,DATEDIFF(DAY,CONVERT(CHAR(8),backup_finish_date,112),CONVERT(CHAR(8),expiration_date,112)) AS expiration_days
,bms.description AS [Description]
,bkup.is_damaged AS isDamaged
,bms.is_compressed AS isCompressed
,bkup.is_copy_only AS isCopyOnly
,bkup.database_creation_date AS DatabaseCreationDate
,bmf.physical_device_name AS PhysicalDeviceName
,CASE WHEN (bkup.backup_start_date is NULL OR bkup.backup_start_date < DATEADD(dd,-1,GetDate()) ) THEN ''Yes'' ELSE ''No'' END AS isOlderThan24Hours
,bkup.database_backup_lsn
,bkup.differential_base_lsn
,bkup.first_lsn
,bkup.last_lsn
,bkup.fork_point_lsn
FROM master.dbo.sysdatabases sysdb
LEFT OUTER JOIN msdb.dbo.backupset bkup ON bkup.database_name = sysdb.name
INNER JOIN msdb.dbo.backupmediafamily AS bmf ON bkup.media_set_id = bmf.media_set_id
LEFT outer JOIN sys.backup_devices AS bd ON bmf.device_type = bd.type
LEFT outer JOIN msdb.dbo.backupmediaset AS bms ON bkup.media_set_id = bms.media_set_id
--WHERE backup_finish_date = (SELECT MAX(bkup.backup_finish_date) FROM  msdb.dbo.backupset bkup WHERE sysdb.name = bkup.database_name) --Last backup
WHERE backup_finish_date > DATEADD(DAY, -1, (getdate()))  -- Last 60 days
AND bkup.type=''L''
AND sysdb.name = ''?''
ORDER BY backup_start_date DESC, backup_finish_date';

I tried writing 'IF ''?'' NOT IN (''tempdb'') SELECT…….' but all results were identical for only one database.
Then I tried writing AND sysdb.name <> ''tempdb'''' but it gave an error:

Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.
Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'DES'.

Best Answer

A possibility would be to check for DB_Name = 'Tempdb', and if it's tempdb just end the script.

This is a quick test I did, and it seems to works :

EXEC sp_msforeachdb 'USE [?] IF DB_Name() = ''Tempdb''BEGIN RETURN END SELECT db_Name()'

That will run the code on each db, but if it's tempdb it wont execute a thing, cause it'll return.

It's also known that using sp_msforeachdb is not always the best thing. Aaron has blogged about using a self made replacement procedure you can use, it might be worth your time to go check it out! making-a-more-reliable-and-flexible-spmsforeachdb