• How about this:

    WITH CTE_missingIndexKeyOrdinal AS (

    SELECT DISTINCT /* remove dups caused by composite constraints */

    DB_NAME() AS [database_name],

    OBJECT_NAME(foreign_keys.parent_object_id) AS [table_name],

    foreign_keys.[name] AS [fk_name]

    FROM sys.foreign_keys AS foreign_keys

    JOINsys.foreign_key_columns AS foreign_key_columns

    ONforeign_keys.[object_id] = foreign_key_columns.constraint_object_id

    WHERENOT EXISTS (

    SELECT'An index with same columns and column order'

    FROM sys.indexes AS indexes

    JOINsys.index_columnsAS index_columns

    ONindexes.[object_id] = index_columns.[object_id]

    WHEREforeign_keys.parent_object_id = indexes.[object_id]

    ANDindexes.index_id = index_columns.index_id

    ANDforeign_key_columns.constraint_column_id = index_columns.key_ordinal

    ANDforeign_key_columns.parent_column_id = index_columns.column_id

    AND OBJECTPROPERTYEX(indexes.[object_id],'IsMSShipped') = 0

    AND indexes.is_hypothetical = 0

    )

    AND foreign_keys.is_ms_shipped = 0

    )

    , CTE_missingIndexColumniId AS (

    SELECT DISTINCT /* remove dups caused by composite constraints */

    DB_NAME() AS [database_name],

    OBJECT_NAME(foreign_keys.parent_object_id) AS [table_name],

    foreign_keys.[name] AS [fk_name]

    FROM sys.foreign_keys AS foreign_keys

    JOINsys.foreign_key_columns AS foreign_key_columns

    ONforeign_keys.[object_id] = foreign_key_columns.constraint_object_id

    WHERENOT EXISTS (

    SELECT'An index with same columns and [POSSIBLY DIFFERENT] column order'

    FROM sys.indexes AS indexes

    JOINsys.index_columnsAS index_columns

    ONindexes.[object_id] = index_columns.[object_id]

    WHEREforeign_keys.parent_object_id = indexes.[object_id]

    ANDindexes.index_id = index_columns.index_id

    ANDforeign_key_columns.constraint_column_id = index_columns.index_column_id

    ANDforeign_key_columns.parent_column_id = index_columns.column_id

    AND OBJECTPROPERTYEX(indexes.[object_id],'IsMSShipped') = 0

    AND indexes.is_hypothetical = 0

    )

    AND foreign_keys.is_ms_shipped = 0

    )

    SELECT [database_name],

    [table_name],

    [fk_name]

    FROM CTE_missingIndexKeyOrdinal

    EXCEPT

    SELECT [database_name],

    [table_name],

    [fk_name]

    FROM CTE_missingIndexColumniId

    UNION

    SELECT [database_name],

    [table_name],

    [fk_name]

    FROM CTE_missingIndexColumniId

    EXCEPT

    SELECT [database_name],

    [table_name],

    [fk_name]

    FROM CTE_missingIndexKeyOrdinal

    ;