Find users who don’t have a login. These are real orphans. We find by name because they might be out of sync by id. We assume that’s already been checked.
One caution is some users may have login access via an Active Directory group. Do not run the DROP statements without testing the impact.
SELECT [sp].[name] AS [LoginName], [dp].[name] AS [UserName], [dp].[principal_id], [dp].[type], [dp].[type_desc], [dp].[default_schema_name], [dp].[create_date], [dp].[modify_date], [dp].[owning_principal_id], [dp].[sid], [dp].[is_fixed_role], [dp].[sid], -- 'DROP SCHEMA [' + QUOTENAME([dp].[name]) + '];' + CHAR(10) + 'DROP USER ' + QUOTENAME([dp].[name]) + ';' FROM [sys].[database_principals] [dp] LEFT OUTER JOIN [sys].[server_principals] [sp] ON [sp].[sid] = [dp].[sid] -- sid could be incorrectly mismatched AND CHARINDEX([dp].[name], [sp].[name]) > 0 -- here we are trying to match by login NAME which makes sense. Occasionally users are created without domain so catch those too. WHERE [dp].[type] IN ('U', 'G') AND [dp].[principal_id] <> 1 AND [sp].[name] IS NULL ORDER BY [UserName]