通过查看内部的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 调用找到主键,据我所知。请使用 Dan Guzman 提供的查询。