2013-01-09 4 views
50

모든 테이블의 제약 조건, 각 테이블의 제약 조건 개수를 검색하는 쿼리의 프레임을 지정하고 제약 조건이없는 테이블의 NULL도 표시 할 수 있습니까? 미리 Thx! SQL Server 2008- 테이블 제약 조건 얻기

내가 지금까지 무엇을 가지고 :

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] 

답변

81
당신은 SQL 서버 2005 이상에 있다면

당신은 (현재 sys 카탈로그 뷰를 사용한다 - sysobjects 전망 을 사용 중지해야하고 있습니다 피하십시오) - extensive MSDN SQL Server Books Online documentation on catalog views here을 확인하십시오.

에 관심이있을 수 있습니다 꽤 전망이있다 : 열 열 키 제약 조건에 대한

  • sys.key_constraints에 점검 제한 조건에 대한
  • sys.check_constraints에 기본 제약

    • sys.default_constraints (예 : 기본 키)를
    • sys.foreign_keys 외래 키 관계

    lot more - 확인해보십시오!

    해당보기를 쿼리하고 참여하여 필요한 정보를 얻을 수 있습니다. 예 : 이 그들에 정의 된 테이블, 열 및 모든 기본 제약 조건을 나열합니다 :

    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 
    
  • +0

    도움 주셔서 감사합니다. 마크,하지만 sysObjects 자체를 사용하여 쿼리를 기대하고 있습니다. 거기에 필요한 결과를 얻기 위해 내 쿼리를 조정할 수있는 방법이 있습니까? – unos

    +0

    쿼리는 첫 번째 테이블의 첫 번째 제약 조건 만 나열합니다. –

    +0

    @SteveStaple : 아니오, 그렇지 않습니다. .....이 모든 것을 사용하고 있습니다. ** 모든 ** 테이블에 ** 모든 ** 제약이 나열되어 있습니다! 'AdventureWorks'에서 시도해보십시오 - 152 행을 얻었고 여러 테이블에 여러 제약 조건이 있습니다. 'Employee' 테이블에는 6 개 이하의 제약 조건이 있으며, 모두 괜찮습니다. –

    2
    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]) 
        ) 
    
    1

    내가 편집하려고했던 answer이 어떤 이유로 받아 들여지지 않았다 그러나 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 
    
    7

    다음 쿼리를 사용하여 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 
    
    1

    이 쿼리

    고유 제한 조건으로받을 수, 값

    기본 제약, 참조 테이블 및 열

    그리고 기본 키 제약 조건

    외래 키.

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

    좋은 답변 ... 고마워 ... – DineshDB