SQL Server 2008-获取表约束

你可以帮我构build一个查询,检索所有表中的约束条件,每个表中的约束条数,还可以为没有任何约束的表显示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] 

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

有很多你可能感兴趣的观点:

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

更多 – 检查出来!

你可以查询和join这些视图来获得所需的信息 – 例如,这将列出表,列和所有定义在它们上面的默认约束:

 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 

我使用以下查询检索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 
 SELECT [oj].[name] [TableName], [ac].[name] [ColumnName], [dc].[name] [DefaultConstraintName], [dc].[definition] FROM sys.default_constraints [dc], sys.all_objects [oj], sys.all_columns [ac] WHERE ( ([oj].[type] IN ('u')) AND ([oj].[object_id] = [dc].[parent_object_id]) AND ([oj].[object_id] = [ac].[object_id]) AND ([dc].[parent_column_id] = [ac].[column_id]) ) 

我试图编辑由marc_s提供的答案 ,但由于某种原因未被接受。 它格式化sql更容易阅读,包括架构,并命名默认名称,以便这可以很容易地粘贴到其他代码。

  SELECT SchemaName = s.Name, TableName = t.Name, ColumnName = c.Name, DefaultName = dc.Name, DefaultDefinition = dc.Definition FROM sys.schemas s JOIN sys.tables t on t.schema_id = s.schema_id JOIN sys.default_constraints dc on dc.parent_object_id = t.object_id JOIN sys.columns c on c.object_id = dc.parent_object_id and c.column_id = dc.parent_column_id ORDER BY s.Name, t.Name, c.name 

你可以得到这个查询

独特的约束,

带值的默认约束,

与引用的表和列的外键

和主键约束。

 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');