• Thanks for taking that so gracefully. Here's the script and the errors, one for ReportServer and one for ReportServerTempDB.

    SET NOCOUNT ON

    /*

    ** "Challenger, go at throttle up..."

    */

    -- Create variables

    DECLARE @dbname VARCHAR(128),

    @loopcounter INT,

    @sqlstmt VARCHAR(MAX)

    -- Create table variable for database names

    DECLARE @dbnames TABLE (

    [RecID] INT IDENTITY(1,1) PRIMARY KEY,

    [DBName] VARCHAR(128)

    )

    -- Create global temporary table for roles found

    CREATE TABLE ##UnusedDatabaseRoles (

    [DBName] VARCHAR(50),

    [RoleName] VARCHAR(50)

    )

    -- Create global temporary table for roles to ignore

    CREATE TABLE ##ExemptRoles (

    [Name] VARCHAR(128) NOT NULL

    )

    -- Populate database name table variable

    INSERT INTO @dbnames ([DBName])

    SELECT [name]

    FROM master.sys.databases

    WHERE [name] NOT IN ('model', 'tempdb')

    AND [source_database_id] IS NULL

    AND (

    DATABASEPROPERTY([name], 'IsEmergencyMode') = 0

    AND DATABASEPROPERTY([name], 'IsInLoad') = 0

    AND DATABASEPROPERTY([name], 'IsInRecovery') = 0

    AND DATABASEPROPERTY([name], 'IsInStandBy') = 0

    AND DATABASEPROPERTY([name], 'IsNotRecovered') = 0

    AND DATABASEPROPERTY([name], 'IsOffline') = 0

    AND DATABASEPROPERTY([name], 'IsShutDown') = 0

    AND DATABASEPROPERTY([name], 'IsSuspect') = 0

    AND [state] = 0

    )

    -- Identify any roles to ignore

    INSERT INTO ##ExemptRoles ([Name])

    VALUES ('db_dtsadmin'), ('db_dtsltduser'), ('db_dtsoperator')

    -- Let's get this party started!

    SET @loopcounter = (SELECT MIN([RecID]) FROM @dbnames)

    WHILE @loopcounter <= (SELECT MAX([RecID]) FROM @dbnames)

    BEGIN

    SELECT @dbname = [DBName]

    FROM @dbnames

    WHERE [RecID] = @loopcounter

    SET @sqlstmt = 'USE ['

    + @dbname + '];'

    + ' INSERT INTO ##UnusedDatabaseRoles ([DBName], [RoleName])'

    + ' SELECT DISTINCT '

    + QUOTENAME(@dbname, CHAR(39))

    + ', RP.[name]'

    + ' FROM sys.database_principals rp'

    + ' LEFT OUTER JOIN sys.database_role_members r'

    + ' ON rp.[principal_id] = r.[role_principal_id]'

    + ' WHERE rp.[type] = CHAR(82)'

    + ' AND r.[role_principal_id] IS NULL'

    + ' AND rp.[is_fixed_role] = 0'

    + ' AND rp.[principal_id] > 0'

    + ' AND rp.[Name] NOT IN (SELECT [Name]'

    --+ ' COLLATE SQL_Latin1_General_CP1_CI_AS '

    + ' FROM ##ExemptRoles)';

    --PRINT @sqlstmt

    EXECUTE (@sqlstmt);

    SET @loopcounter = @loopcounter + 1;

    END

    -- Show results

    SELECT * FROM ##UnusedDatabaseRoles

    /*

    ** Housekeeping

    */

    DROP TABLE ##UnusedDatabaseRoles

    DROP TABLE ##ExemptRoles

    SET NOCOUNT OFF

    GO

    Msg 468, Level 16, State 9, Line 1

    Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS_KS_WS" in the equal to operation.

    Msg 468, Level 16, State 9, Line 1

    Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS_KS_WS" in the equal to operation.