Глядя на внутренний SqlMetaDataFactory
, вызов sqlConnection.GetSchema("IndexColumns");
выполняет поиск команды для выполнения, найденной в файле ресурсов System.Data.SqlClient.SqlMetaData.xml
, и это покажет нам запись IndexColumns
<MetaDataCollections>
<CollectionName>IndexColumns</CollectionName>
<NumberOfRestrictions>5</NumberOfRestrictions>
<NumberOfIdentifierParts>4</NumberOfIdentifierParts>
<PopulationMechanism>SQLCommand</PopulationMechanism>
<PopulationString>EXEC sys.sp_indexcolumns_managed @Catalog, @Owner, @Table, @ConstraintName, @Column</PopulationString>
<MinimumVersion>10.00.0000</MinimumVersion>
</MetaDataCollections>
Это означает, что он выполнит EXEC sys.sp_indexcolumns_managed
. Эта хранимая процедура покажет с помощью EXEC sp_helptext 'sys.sp_indexcolumns_managed'
, что она выбирает из sys.spt_indexcolumns_view_managed
, и это представление определяется как:
select distinct
db_Name() as constraint_catalog,
constraint_schema = SCHEMA_NAME(o.schema_id),
constraint_name = x.name,
table_catalog = db_name(),
table_schema = SCHEMA_NAME(o.schema_id),
table_name = o.name,
column_name = c.name,
ordinal_position = xc.key_ordinal,
KeyType = c.system_type_id,
index_name = x.name
from
sys.objects o INNER JOIN sys.indexes x ON
(
o.object_id = x.object_id AND
o.type in ('U')
) INNER JOIN
sys.index_columns xc ON
(
xc.object_id = x.object_id AND
xc.index_id = x.index_id
) INNER JOIN
sys.columns c ON
(
o.object_id = c.object_id AND
xc.column_id = c.column_id
)
(Вы можете найти его определение с помощью SELECT OBJECT_DEFINITION(OBJECT_ID('sys.sp_indexcolumns_managed'));
, поскольку оно является частью База данных ресурсов)
Теперь мы видим, что столбец KeyType проецируется на sys.columns.system_type_id
, что задокументировано в sys.columns как
ID системного типа столбца.
и Где найти метаданные Sql Server для типов данных столбцов? подробности о том, что объединение с sys.types
даст вам информацию о типе столбца.
Вооружившись этой информацией, мы уже можем заключить, что я думаю, KeyType = 56 означает первичный ключ, это неверно и работает.
select name, system_type_id, user_type_id, schema_id, max_length, precision scale
from sys.types
where system_type_id = 56
вернется
name system_type_id user_type_id schema_id max_length scale
---- -------------- ------------ --------- ---------- -----
int 56 56 4 4 10
и это тип столбца, а не первичный ключ.
Кажется, нет надежного способа найти первичный ключ с помощью вызова GetSchema, AFAICT. Используйте запрос, предоставленный Дэном Гузманом.
person
rene
schedule
24.12.2017