如何在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的附加信息。这是colidsys.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中获得列式约束的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Sql server中是不是存在约束?

如何仅使用表名从 SQL Server 中删除主键约束

2 - SQL Server 2008 之 使用SQL语句为现有表添加约束条件

SQL server 2005如何设置一个或几个字段唯一约束?

sql server如何添加外键

如何在 sql server 2008 中获取没有约束的表列?