Я использую следующий запрос для вывода списка ограничений таблицы (первичные ключи, уникальные ключи, внешние ключи), однако мне трудно получить список внешних ключей и их ссылок (столбцы).
Может кто-нибудь посоветовать и показать, как я могу изменить этот код, чтобы я мог получить список столбцов ограничения по умолчанию, сохраняя при этом ключ 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"