В MSSQL.ttinclude неверно строятся ассоциация для FOREIGN KEY состоящих из нескольких полей.
Проблема заключается в том, что запрос:
SELECT
rc.CONSTRAINT_NAME as Name,
fk.TABLE_CATALOG + '.' + fk.TABLE_SCHEMA + '.' + fk.TABLE_NAME as ThisTable,
fk.COLUMN_NAME as ThisColumn,
pk.TABLE_CATALOG + '.' + pk.TABLE_SCHEMA + '.' + pk.TABLE_NAME as OtherTable,
pk.COLUMN_NAME as OtherColumn,
cu.ORDINAL_POSITION as Ordinal
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE fk
ON
rc.CONSTRAINT_CATALOG = fk.CONSTRAINT_CATALOG AND
rc.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE pk
ON
rc.UNIQUE_CONSTRAINT_CATALOG = pk.CONSTRAINT_CATALOG AND
rc.UNIQUE_CONSTRAINT_NAME = pk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
ON
rc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME
ORDER BY
ThisTable,
Ordinal
не учитывает ORDINAL колонок из FOREIGN KEY и соответствующих колонок в UNIQUE CONSTRAINT и возвращает всевозможные комбинации этих колонок.
Исправленный запрос:
SELECT
rc.CONSTRAINT_NAME as Name,
fk.TABLE_CATALOG + '.' + fk.TABLE_SCHEMA + '.' + fk.TABLE_NAME as ThisTable,
fk.COLUMN_NAME as ThisColumn,
pk.TABLE_CATALOG + '.' + pk.TABLE_SCHEMA + '.' + pk.TABLE_NAME as OtherTable,
pk.COLUMN_NAME as OtherColumn,
pk.ORDINAL_POSITION as Ordinal
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fk
ON
rc.CONSTRAINT_CATALOG = fk.CONSTRAINT_CATALOG AND
rc.CONSTRAINT_SCHEMA = fk.CONSTRAINT_SCHEMA AND
rc.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pk
ON
rc.UNIQUE_CONSTRAINT_CATALOG = pk.CONSTRAINT_CATALOG AND
rc.UNIQUE_CONSTRAINT_SCHEMA = pk.CONSTRAINT_SCHEMA AND
rc.UNIQUE_CONSTRAINT_NAME = pk.CONSTRAINT_NAME AND
fk.ORDINAL_POSITION = pk.ORDINAL_POSITION
ORDER BY
ThisTable,
Name,
Ordinal
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>