[T4, MSSQL bug] Ассоциации из нескольких полей
От: Alexey Axyonov Украина  
Дата: 25.11.10 09:50
Оценка:
В 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.