Introduction
While working on multiple databases on a single instance, sometimes, you need to execute a query for each database for which sp_MSforeachdb
is the best choice.
Recently talking to my development team, I came to know that very few guys have an idea about a filter for sp_MSforeachDB
.
For example, if I need to get database physical files information for each database on my instance, I will use the following simple query:
EXEC sp_MSforeachdb '
BEGIN
SELECT name,physical_name,state,size
FROM ?.sys.database_files
END'
BUT what if I need to omit MSDB, TempDB and Model databases for this query. Now I have to apply a filter. This can be achieved by a simple IF
statement.
EXEC sp_MSforeachdb 'IF ''?'' NOT IN (''tempDB'',''model'',''msdb'')
BEGIN
SELECT name,physical_name,state,size
FROM ?.sys.database_files
END'
You can even use ? sign in WHERE
clause.
EXEC sp_MSforeachdb 'IF ''?'' NOT IN (''tempDB'',''model'',''msdb'')
BEGIN
SELECT name,physical_name,state,size
FROM ?.sys.database_files
WHERE name LIKE ''?%'' -- Only Files starting with DB name
END'
Output can be saved in tables (user, temporary) or table variables:
DECLARE @DatabasesSize TABLE
(
name VARCHAR(50),
physical_name VARCHAR(500),
state BIT,
size INT
)
INSERT INTO@DatabasesSize
EXEC sp_MSforeachdb 'IF ''?'' NOT IN (''tempDB'',''model'',''msdb'')
BEGIN
SELECT name,physical_name,state,size
FROM ?.sys.database_files
END'
Aasim Abdullah is working as SQL Server DBA with CureMD (www.curemd.com) based in NY, USA. He has been working with SQL Server since 2007 (Version 2005) and has used it in many projects as a developer, administrator, database designer. Aasim's primary interest is SQL Server performance tuning. If he finds the time, he like to sketch faces with graphite pencils.