我在哪里可以验证 SQL 键类型代码?
Where can I verify SQL key type codes?
基于SQL Server Schema Collections我想使用sqlConnection.GetSchema("IndexColumns");
来确定哪些列是主键。
我做了一些实验,发现通过上述请求我得到了一个数据table,其中包含以下信息:
table_catalog table_schema table_name column_name ordinal_position KeyType index_name
---------------------------------------------------------------------------------------------------------------------------
TestDb dbo TestTableWithPrimaryKey Id 1 56 PK_TestTableWithPrimaryKey
我猜 KeyType = 56
代表 primary-key 但这只能从这个 table 定义推导出来:
CREATE TABLE [dbo].[TestTableWithPrimaryKey]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Foo] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_TestTableWithPrimaryKey]
PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]
在我实际将其用于任何项目之前,我想验证我的发现是否正确。有什么地方可以获取所有类型的密钥吗?
KeyType
列似乎映射到 SQL 服务器 sys.types
目录视图 system_type
列枚举的列数据类型(值 56 是 int
).因此,这无助于将该列标识为主键的成员。
有多种方法可以获取 SQL 服务器主键列,包括 SMO 和目录视图查询。这是获取 SQL 服务器数据库中所有主键列的示例。如果您需要支持多个 DBMS 产品,您可以改为使用 INFORMATION_SCHEMA
实现这些 ANSI 标准视图的 DBMS 产品的目录视图。
SELECT
OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName
, OBJECT_NAME(i.object_id) AS TableName
, c.name AS ColumnName
, ic.key_ordinal AS KeyOrdinal
FROM sys.key_constraints AS kc
JOIN sys.indexes AS i ON i.object_id = kc.parent_object_id AND kc.name = i.name
JOIN sys.index_columns AS ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id
JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
WHERE kc.type_desc = N'PRIMARY_KEY_CONSTRAINT'
ORDER BY
SchemaName
, TableName
, KeyOrdinal;
通过查看内部 SqlMetaDataFactory
对 sqlConnection.GetSchema("IndexColumns");
的调用确实查找在资源文件 System.Data.SqlClient.SqlMetaData.xml
中找到的要执行的命令,这将向我们显示条目 索引列
<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
。该存储过程将显示它从 sys.spt_indexcolumns_view_managed
中选择的 EXEC sp_helptext 'sys.sp_indexcolumns_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 of the system type of the column.
和 Where do I find Sql Server metadata for column datatypes? 加入 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
将 return
name system_type_id user_type_id schema_id max_length scale
---- -------------- ------------ --------- ---------- -----
int 56 56 4 4 10
那是列类型,如果它是主键则不是。
似乎没有通过 GetSchema 调用 AFAICT 找到主键的可靠方法。使用 .
提供的查询
基于SQL Server Schema Collections我想使用sqlConnection.GetSchema("IndexColumns");
来确定哪些列是主键。
我做了一些实验,发现通过上述请求我得到了一个数据table,其中包含以下信息:
table_catalog table_schema table_name column_name ordinal_position KeyType index_name
---------------------------------------------------------------------------------------------------------------------------
TestDb dbo TestTableWithPrimaryKey Id 1 56 PK_TestTableWithPrimaryKey
我猜 KeyType = 56
代表 primary-key 但这只能从这个 table 定义推导出来:
CREATE TABLE [dbo].[TestTableWithPrimaryKey]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Foo] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_TestTableWithPrimaryKey]
PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]
在我实际将其用于任何项目之前,我想验证我的发现是否正确。有什么地方可以获取所有类型的密钥吗?
KeyType
列似乎映射到 SQL 服务器 sys.types
目录视图 system_type
列枚举的列数据类型(值 56 是 int
).因此,这无助于将该列标识为主键的成员。
有多种方法可以获取 SQL 服务器主键列,包括 SMO 和目录视图查询。这是获取 SQL 服务器数据库中所有主键列的示例。如果您需要支持多个 DBMS 产品,您可以改为使用 INFORMATION_SCHEMA
实现这些 ANSI 标准视图的 DBMS 产品的目录视图。
SELECT
OBJECT_SCHEMA_NAME(i.object_id) AS SchemaName
, OBJECT_NAME(i.object_id) AS TableName
, c.name AS ColumnName
, ic.key_ordinal AS KeyOrdinal
FROM sys.key_constraints AS kc
JOIN sys.indexes AS i ON i.object_id = kc.parent_object_id AND kc.name = i.name
JOIN sys.index_columns AS ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id
JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
WHERE kc.type_desc = N'PRIMARY_KEY_CONSTRAINT'
ORDER BY
SchemaName
, TableName
, KeyOrdinal;
通过查看内部 SqlMetaDataFactory
对 sqlConnection.GetSchema("IndexColumns");
的调用确实查找在资源文件 System.Data.SqlClient.SqlMetaData.xml
中找到的要执行的命令,这将向我们显示条目 索引列
<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
。该存储过程将显示它从 sys.spt_indexcolumns_view_managed
中选择的 EXEC sp_helptext 'sys.sp_indexcolumns_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 of the system type of the column.
和 Where do I find Sql Server metadata for column datatypes? 加入 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
将 return
name system_type_id user_type_id schema_id max_length scale
---- -------------- ------------ --------- ---------- -----
int 56 56 4 4 10
那是列类型,如果它是主键则不是。
似乎没有通过 GetSchema 调用 AFAICT 找到主键的可靠方法。使用