SQL Server 2008-获取表约束

uno*_*nos 57 sql sql-server constraints sql-server-2008

你能帮我构建一个查询来检索所有表中的约束,每个表中的约束计数,以及对没有任何约束的表显示NULL.Thx提前!

这是我到目前为止:

Select  SysObjects.[Name] As [Constraint Name] ,
        Tab.[Name] as [Table Name],
        Col.[Name] As [Column Name]
From SysObjects Inner Join 
(Select [Name],[ID] From SysObjects) As Tab
On Tab.[ID] = Sysobjects.[Parent_Obj] 
Inner Join sysconstraints On sysconstraints.Constid = Sysobjects.[ID] 
Inner Join SysColumns Col On Col.[ColID] = sysconstraints.[ColID] And Col.[ID] = Tab.[ID]
order by [Tab].[Name] 
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 103

您应该使用当前sys目录视图(如果您使用的是SQL Server 2005或更高版本 - 不建议使用这些sysobjects视图,应该避免使用) - 请在此处查看有关目录视图大量MSDN SQL Server联机丛书文档.

你可能会对以下几种观点感兴趣:

  • sys.default_constraints 对于列的默认约束
  • sys.check_constraints 用于检查列的约束
  • sys.key_constraints 对于关键约束(例如主键)
  • sys.foreign_keys 对于外国关系

还有更多 - 看看吧!

您可以查询并加入这些视图以获取所需的信息 - 例如,这将列出表,列和在其上定义的所有默认约束:

SELECT 
    TableName = t.Name,
    ColumnName = c.Name,
    dc.Name,
    dc.definition
FROM sys.tables t
INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id
INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id
ORDER BY t.Name
Run Code Online (Sandbox Code Playgroud)

  • 不是完全相关,也不是捅任何人,但格式化风格,我可以读取蝙蝠! (3认同)

Jos*_*zca 11

我使用以下查询来检索SQL Server 2012中的约束信息,并且工作正常.我希望它对你有用.

SELECT 
    tab.name AS [Table]
    ,tab.id AS [Table Id]
    ,constr.name AS [Constraint Name]
    ,constr.xtype AS [Constraint Type]
    ,CASE constr.xtype WHEN 'PK' THEN 'Primary Key' WHEN 'UQ' THEN 'Unique' ELSE '' END AS [Constraint Name]
    ,i.index_id AS [Index ID]
    ,ic.column_id AS [Column ID]
    ,clmns.name AS [Column Name]
    ,clmns.max_length AS [Column Max Length]
    ,clmns.precision AS [Column Precision]
    ,CASE WHEN clmns.is_nullable = 0 THEN 'NO' ELSE 'YES' END AS [Column Nullable]
    ,CASE WHEN clmns.is_identity = 0 THEN 'NO' ELSE 'YES' END AS [Column IS IDENTITY]
FROM SysObjects AS tab
INNER JOIN SysObjects AS constr ON(constr.parent_obj = tab.id AND constr.type = 'K')
INNER JOIN sys.indexes AS i ON( (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tab.id) AND i.name = constr.name )
INNER JOIN sys.index_columns AS ic ON (ic.column_id > 0 and (ic.key_ordinal > 0 or ic.partition_ordinal = 0 or ic.is_included_column != 0)) 
                                    AND (ic.index_id=CAST(i.index_id AS int) 
                                    AND ic.object_id=i.object_id)
INNER JOIN sys.columns AS clmns ON clmns.object_id = ic.object_id and clmns.column_id = ic.column_id
WHERE tab.xtype = 'U'
ORDER BY tab.name
Run Code Online (Sandbox Code Playgroud)


Pro*_*oje 7

您可以使用此查询

独特的约束,

默认约束值,

外键引用表和列

和主键约束.

Select C.*, (Select definition From sys.default_constraints Where object_id = C.object_id) As dk_definition,
(Select definition From sys.check_constraints Where object_id = C.object_id) As ck_definition,
(Select name From sys.objects Where object_id = D.referenced_object_id) As fk_table,
(Select name From sys.columns Where column_id = D.parent_column_id And object_id = D.parent_object_id) As fk_col
From sys.objects As C
Left Join (Select * From sys.foreign_key_columns) As D On D.constraint_object_id = C.object_id 
Where C.parent_object_id = (Select object_id From sys.objects Where type = 'U'
And name = 'Table Name Here');
Run Code Online (Sandbox Code Playgroud)