• Abhijit, your solution gives me only unused indexes in the current database. I'm looking for a solution to find all unused indexes in a number of databases, which have all the same structure, but are named differently.

    Chirag, your solution gives me errors at the Inner join

    DECLARE @Database TABLE(Naam VarChar(20))

    DECLARE @IndexNaam TABLE(

    DatabaseName VarChar(Max)

    ,Database_IdInt

    , TableName VarChar(Max)

    , IndexName VarChar(Max)

    , IndexId Int

    )

    DECLARE @TableCount Int

    DECLARE @SqlCmd nVarChar(Max)

    INSERT @DataBase(Naam)

    SELECT name FROM sys.databases D

    WHERE D.name like 'McBam%'

    SELECT * FROM @DataBase

    SELECT @TableCount = (SELECT COUNT(*) FROM @DataBase)

    Print @TableCount

    SET @SqlCmd = 'USE ?;SELECT DB_NAME() AS DATABASENAME,

    OBJECT_NAME(B.OBJECT_ID) AS TABLENAME,

    B.NAME AS INDEXNAME,

    B.INDEX_ID

    FROM SYS.DM_DB_INDEX_USAGE_STATS C

    WHERE B.OBJECT_ID = C.OBJECT_ID

    AND B.INDEX_ID = C.INDEX_ID

    INNER JOIN @Database D ON C.database_id = D.database_id

    WHERE NOT EXISTS (SELECT *

    FROM SYS.DM_DB_INDEX_USAGE_STATS C

    WHERE B.OBJECT_ID = C.OBJECT_ID

    AND B.INDEX_ID = C.INDEX_ID)

    AND A.TYPE <> '''+'S'+'''

    AND B.NAME > ''''

    AND B.NAME not like '''+'%rowid%'+'''

    ORDER BY 1, 2, 3 '

    INSERT @IndexNaam (DatabaseName, TableName, IndexName, IndexId)

    EXEC sp_MSforeachdb @SqlCmd

    SELECT TableName, IndexName, Count(*) as Aantal FROM @DataBase

    Inner Join @IndexNaam on DatabaseName = Naam

    Group by TableName, IndexName

    Having Count(*) = @TableCount

    Order By TableName, IndexName

    So, I guess it boils down to: How do I restrict the sp_MSforeachdb to only the databases I want?

    Cees