DisplayName not selected, so you cannot use it to ORDER BY set obtained from UNION . If you want to order it and omit from the results,
;WITH T (FunctionRoleID, FunctionRoleInternalName, DisplayName) AS ( SELECT fr.FunctionRoleID, fr.FunctionRoleInternalName, fr.DisplayName FROM users u JOIN UserRoles ur ON ur.UserID = u.UserID JOIN Roles_FunctionRoles rfr ON rfr.RoleID = ur.RoleID JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID WHERE u.UserName = @UserName AND u.Active = 1 UNION SELECT fr.FunctionRoleID, fr.FunctionRoleInternalName, fr.DisplayName FROM Roles r JOIN Roles_FunctionRoles rfr ON rfr.RoleID = r.RoleID JOIN FunctionRoles fr ON fr.FunctionRoleID = rfr.FunctionRoleID WHERE r.RoleName = 'Authenticated Users' and @UserName is not null and LEN(@UserName) > 0 ) SELECT FunctionRoleID, FunctionRoleInternalName FROM T ORDER BY DisplayName
source share