通过查看内部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'));
因为它是Resource Database的一部分)
现在我们可以看到 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 似乎没有可靠的方法来查找主键。使用Dan Guzman提供的查询。