如何在SQL Server中获得列式约束
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL Server中获得列式约束相关的知识,希望对你有一定的参考价值。
我使用以下查询来获取所需表的约束:
SELECT
OBJECT_NAME(o.object_id) AS ConstraintName,
SCHEMA_NAME(schema_id) AS SchemaName,
OBJECT_NAME(parent_object_id) AS TableName,
type_desc AS ConstraintType
FROM
sys.objects o
-- INNER JOIN
-- sys.columns c ON o.object_id = c.object_id
WHERE
type_desc LIKE '%CONSTRAINT'
AND OBJECT_NAME(parent_object_id)= 'All_Data_Types'
成功获取表格约束细节。但是,我也想要列的信息。
有人可以帮我吗?
提前致谢
答案
默认约束的快速解决方案是
SELECT dc.object_id AS ConstraintID, DC.name AS ConstraintName
, O.object_id AS TableID, O.name AS TableName
, C.object_id AS ColumnID, C.name AS ColName
FROM sys.default_constraints AS DC
LEFT JOIN sys.objects AS O ON O.object_id = DC.parent_object_id
LEFT JOIN sys.columns c ON o.object_id = c.object_id AND DC.parent_column_id = c.column_id
另一答案
对于表约束,您可以使用以下内容:
SELECT KCU.*, TC.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON TC.CONSTRAINT_SCHEMA = KCU.CONSTRAINT_SCHEMA AND TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
另一答案
如果您使用的是SQL Server 2012或更高版本,则可以使用系统视图sys.sysconstraints
:
包含对拥有数据库中约束的对象的约束映射。
所以,这个查询:
SELECT *
FROM sys.sysconstraints s
INNER JOIN sys.objects o ON o.object_id = s.constid
理论上返回与查询相同的行数。但是现在您有关于定义约束的列的ID的附加信息。这是colid
的sys.sysconstraints
列:
定义约束的列的ID。
0 =表约束
因此,使用此查询:
SELECT OBJECT_NAME(o.object_id) AS ConstraintName,
SCHEMA_NAME(o.schema_id) AS SchemaName,
OBJECT_NAME(o.parent_object_id) AS TableName,
o.type_desc AS ConstraintType,
COALESCE(c.COLUMN_NAME, 'Table constraint') AS ColumnName
FROM sys.sysconstraints s
INNER JOIN sys.objects o ON o.object_id = s.constid
LEFT JOIN INFORMATION_SCHEMA.COLUMNS c ON c.ORDINAL_POSITION = s.colid AND s.colid <> 0
您还可以获得与约束相关的列的名称。
另一答案
这是查询。您在错误的表column_name上使用INNER JOIN
。你用过这个
INNER JOIN sys.columns c ON o.object_id = c.object_id
我换了它
INNER JOIN sys.columns c ON o.parent_object_id = c.object_id
现在,您可以看到column_name以及table_name以及constraint_details。
SELECT OBJECT_NAME(o.object_id) AS ConstraintName,
SCHEMA_NAME(schema_id) AS SchemaName,
OBJECT_NAME(parent_object_id) AS TableName,
c.name as ColumnName,
type_desc AS ConstraintType
FROM sys.objects o
INNER JOIN sys.columns c ON o.parent_object_id = c.object_id
WHERE type_desc LIKE '%CONSTRAINT';
另外,请避免使用以下条款
AND OBJECT_NAME(parent_object_id)= 'All_Data_Types'
以上是关于如何在SQL Server中获得列式约束的主要内容,如果未能解决你的问题,请参考以下文章
2 - SQL Server 2008 之 使用SQL语句为现有表添加约束条件