Как вывести список столбцов ограничения по умолчанию на сервере SQL, используя запрос SQL? - PullRequest
0 голосов
/ 15 апреля 2020

Я использую следующий запрос для вывода списка ограничений таблицы (первичные ключи, уникальные ключи, внешние ключи), однако мне трудно получить список внешних ключей и их ссылок (столбцы).

Может кто-нибудь посоветовать и показать, как я могу изменить этот код, чтобы я мог получить список столбцов ограничения по умолчанию, сохраняя при этом ключ PK, FK, UQ.

** Мне нужно будет использовать код для моего проекта, поэтому я был бы признателен, если бы вы могли мне полный код, поскольку я не знаком с SQL ...

Вот мой оригинальный код

"select table_view,
    object_type, 
    constraint_type,
    constraint_name,
    details,
    fk_columns,
    referenceTable,
    pk_columns
from (
    select schema_name(t.schema_id) + '.' + t.[name] as table_view, 
        case when t.[type] = 'U' then 'Table'
            when t.[type] = 'V' then 'View'
            end as [object_type],
        case when c.[type] = 'PK' then 'Primary key'
            when c.[type] = 'UQ' then 'Unique constraint'
            when i.[type] = 1 then 'Unique clustered index'
            when i.type = 2 then 'Unique index'
            end as constraint_type, 
        isnull(c.[name], i.[name]) as constraint_name,
        substring(column_names, 1, len(column_names)-1) as [details],
        '' fk_columns,
        '' pk_columns,
        '' referenceTable
    from sys.objects t
        left outer join sys.indexes i
            on t.object_id = i.object_id
        left outer join sys.key_constraints c
            on i.object_id = c.parent_object_id 
            and i.index_id = c.unique_index_id
       cross apply (select col.[name] + ', '
                        from sys.index_columns ic
                            inner join sys.columns col
                                on ic.object_id = col.object_id
                                and ic.column_id = col.column_id
                        where ic.object_id = t.object_id
                            and ic.index_id = i.index_id
                                order by col.column_id
                                for xml path ('') ) D (column_names)
    where is_unique = 1
    and t.is_ms_shipped <> 1
    union all 
    SELECT schema_name(fk_tab.schema_id) + '.' + fk_tab.name as foreign_table,
        'Table',
        'Foreign key',
        fk.name as fk_constraint_name,
        schema_name(objects.schema_id) + '.' + objects.[name] + '.' + col.[name] as details,
        col.[name] as [fk_columns],
        schema_name(pk_tab.schema_id) + '.' + pk_tab.name,
        col2.[name] as [pk_columns]
    FROM
        sys.objects objects
        INNER JOIN sys.tables fk_tab on objects.object_id = fk_tab.object_id
        INNER JOIN sys.foreign_keys fk on fk_tab.object_id = fk.parent_object_id
        INNER JOIN sys.tables pk_tab on pk_tab.object_id = fk.referenced_object_id
        INNER JOIN sys.foreign_key_columns fk_c on fk_c.parent_object_id = fk.parent_object_id
                       and fk_c.constraint_object_id = fk.object_id
            inner join sys.columns col
                            on fk_c.parent_object_id = col.object_id
                            and fk_c.parent_column_id = col.column_id
        left join sys.columns col2
                            on fk_c.referenced_object_id = col2.object_id
                            and fk_c.referenced_column_id = col2.column_id
    union all
    select schema_name(t.schema_id) + '.' + t.[name],
        'Table',
        'Check constraint',
        con.[name] as constraint_name,
        con.[definition],
         '' as [fk_columns],
        '' as [pk_columns],
        '' referenceTable
    from sys.check_constraints con
        left outer join sys.objects t
            on con.parent_object_id = t.object_id
        left outer join sys.all_columns col
            on con.parent_column_id = col.column_id
            and con.parent_object_id = col.object_id
    union all
    select schema_name(t.schema_id) + '.' + t.[name],
        'Table',
        'Default constraint',
        con.[name],
        col.[name] + ' = ' + con.[definition],
         '' as [fk_columns],
        '' as [pk_columns],
        '' referenceTable
    from sys.default_constraints con
        left outer join sys.objects t
            on con.parent_object_id = t.object_id
        left outer join sys.all_columns col
            on con.parent_column_id = col.column_id
            and con.parent_object_id = col.object_id) a
where table_view like 'dbo%'
order by table_view, constraint_type, constraint_name"

И вот что я попробовал, но он не работает

SQLServerException: все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь одинаковое количество выражений в своих целевых списках.

"select table_view,
    object_type, 
    constraint_type,
    constraint_name,
    details,
    fk_columns,
    referenceTable,
    pk_columns,
    df_columns
from (
    select schema_name(t.schema_id) + '.' + t.[name] as table_view, 
        case when t.[type] = 'U' then 'Table'
            when t.[type] = 'V' then 'View'
            end as [object_type],
        case when c.[type] = 'PK' then 'Primary key'
            when c.[type] = 'UQ' then 'Unique constraint'
            when i.[type] = 1 then 'Unique clustered index'
            when i.type = 2 then 'Unique index'
            end as constraint_type, 
        isnull(c.[name], i.[name]) as constraint_name,
        substring(column_names, 1, len(column_names)-1) as [details],
        '' fk_columns,
        '' pk_columns,
        '' df_columns,
        '' referenceTable
    from sys.objects t
        left outer join sys.indexes i
            on t.object_id = i.object_id
        left outer join sys.key_constraints c
            on i.object_id = c.parent_object_id 
            and i.index_id = c.unique_index_id
       cross apply (select col.[name] + ', '
                        from sys.index_columns ic
                            inner join sys.columns col
                                on ic.object_id = col.object_id
                                and ic.column_id = col.column_id
                        where ic.object_id = t.object_id
                            and ic.index_id = i.index_id
                                order by col.column_id
                                for xml path ('') ) D (column_names)
    where is_unique = 1
    and t.is_ms_shipped <> 1
    union all 
    SELECT schema_name(fk_tab.schema_id) + '.' + fk_tab.name as foreign_table,
        'Table',
        'Foreign key',
        fk.name as fk_constraint_name,
        schema_name(objects.schema_id) + '.' + objects.[name] + '.' + col.[name] as details,
        col.[name] as [fk_columns],
        schema_name(pk_tab.schema_id) + '.' + pk_tab.name,
        col2.[name] as [pk_columns]
    FROM
        sys.objects objects
        INNER JOIN sys.tables fk_tab on objects.object_id = fk_tab.object_id
        INNER JOIN sys.foreign_keys fk on fk_tab.object_id = fk.parent_object_id
        INNER JOIN sys.tables pk_tab on pk_tab.object_id = fk.referenced_object_id
        INNER JOIN sys.foreign_key_columns fk_c on fk_c.parent_object_id = fk.parent_object_id
                       and fk_c.constraint_object_id = fk.object_id
            inner join sys.columns col
                            on fk_c.parent_object_id = col.object_id
                            and fk_c.parent_column_id = col.column_id
        left join sys.columns col2
                            on fk_c.referenced_object_id = col2.object_id
                            and fk_c.referenced_column_id = col2.column_id
    union all
    select schema_name(t.schema_id) + '.' + t.[name],
        'Table',
        'Check constraint',
        con.[name] as constraint_name,
        con.[definition],
         '' as [fk_columns],
        '' as [pk_columns],
        '' as [df_columns],
        '' referenceTable
    from sys.check_constraints con
        left outer join sys.objects t
            on con.parent_object_id = t.object_id
        left outer join sys.all_columns col
            on con.parent_column_id = col.column_id
            and con.parent_object_id = col.object_id
    union all
    select schema_name(t.schema_id) + '.' + t.[name],
        'Table',
        'Default constraint',
        con.[name],
        col.[name] + ' = ' + con.[definition],
         '' as [fk_columns],
        '' as [pk_columns],
        col.[name] as [df_columns],
        '' referenceTable
    from sys.default_constraints con
        left outer join sys.objects t
            on con.parent_object_id = t.object_id
        left outer join sys.all_columns col
            on con.parent_column_id = col.column_id
            and con.parent_object_id = col.object_id) a
where table_view like 'dbo%'
order by table_view, constraint_type, constraint_name"

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

После просмотра кода я понимаю, что могу получить имя столбца, изменив имя_ограничения.

После ограничения по умолчанию измените с con. [Имя] на столбец [имя]

select schema_name(t.schema_id) + '.' + t.[name],
    'Table',
    'Default constraint',
    col.[name],
    col.[name] + ' = ' + con.[definition],
     '' as [fk_columns],
    '' as [pk_columns],
    '' referenceTable
0 голосов
/ 15 апреля 2020

Я использую это, чтобы найти все ограничения внешнего ключа, проверить ограничения и ограничения по умолчанию. Вы можете начать с этого и настроить соответственно, в зависимости от того, какие типы ограничений вы хотите перечислить.

Для получения полного списка типов проверьте все возможные значения для столбца type в системной таблице sys.objects .

SELECT t.name tableName, 
        o.name AS constraintName,
        SCHEMA_NAME(t.SCHEMA_ID) sch,
        o.type ctype
FROM sys.foreign_key_columns AS fk
        INNER JOIN sys.tables AS t ON fk.parent_object_id = t.object_id
        INNER JOIN sys.columns AS c ON fk.parent_object_id = c.object_id AND fk.parent_column_id = c.column_id
        INNER JOIN sys.objects AS o ON fk.constraint_object_id = o.object_id
UNION ALL
SELECT t.name tableName, 
           o.name AS constraintName,
        SCHEMA_NAME(t.SCHEMA_ID) sch,
        o.type ctype
FROM   sys.objects o JOIN sys.tables t on t.object_id = o.parent_object_id
WHERE o.type IN ('D', 'C') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...