Для SQL Server 2008 взгляните на системные таблицы sys.tables
, sys.table_types
и sys.columns
.
В одной из моих баз данных у меня есть тип таблицы с именем candidateRoutes
и физическая таблица.(реальная) таблица называется RouteArea
Следующие два запроса:
select sys.columns.* from sys.table_types join sys.columns on sys.columns.object_id = sys.table_types.type_table_object_id where sys.table_types.name = 'candidateRoutes'
select sys.columns.* from sys.tables join sys.columns on sys.columns.object_id = sys.tables.object_id where sys.tables.name = 'RouteArea'
return:
object_id name column_id system_type_id user_type_id max_length precision scale collation_name is_nullable is_ansi_padded is_rowguidcol is_identity is_computed is_filestream is_replicated is_non_sql_subscribed is_merge_published is_dts_replicated is_xml_document xml_collection_id default_object_id rule_object_id is_sparse is_column_set
215671816 RouteId 1 56 56 4 10 0 NULL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
215671816 Area 2 240 130 -1 0 0 NULL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
и
object_id name column_id system_type_id user_type_id max_length precision scale collation_name is_nullable is_ansi_padded is_rowguidcol is_identity is_computed is_filestream is_replicated is_non_sql_subscribed is_merge_published is_dts_replicated is_xml_document xml_collection_id default_object_id rule_object_id is_sparse is_column_set
1675153013 RouteId 1 127 127 8 19 0 NULL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1675153013 ValidFrom 2 61 61 8 23 3 NULL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1675153013 ValidTo 3 61 61 8 23 3 NULL 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1675153013 Line 4 240 130 -1 0 0 NULL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1675153013 Area 5 240 130 -1 0 0 NULL 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
таквозможно, вы могли бы сделать что-то вроде этого:
with
TableType as
(select name, user_type_id, max_length, precision from sys.columns where object_id = (select type_table_object_id from sys.table_types where name = 'candidateRoutes')),
PhysicalTable as
(select name, user_type_id, max_length, precision from sys.columns where object_id = (select object_id from sys.tables where name = 'RouteArea'))
select * from TableType full join PhysicalTable
on TableType.name = PhysicalTable.name
where TableType.name is null
or PhysicalTable.name is null
or TableType.user_type_id <> PhysicalTable.user_type_id
or TableType.max_length <> PhysicalTable.max_length
or TableType.precision <> PhysicalTable.precision
, но включая scale, collation_name, is_nullable
и т. д., чтобы найти все столбцы, которые не соответствуют.В моем случае я получаю:
name user_type_id max_length precision name user_type_id max_length precision
RouteId 56 4 10 RouteId 127 8 19
NULL NULL NULL NULL ValidFrom 61 8 23
NULL NULL NULL NULL ValidTo 61 8 23
NULL NULL NULL NULL Line 130 -1 0
Если строки не возвращаются, тип и таблица совпадают.