2013-01-09 15 views
50

Czy możesz mi pomóc ramka kwerendy, która pobiera ograniczenia we wszystkich tabelach, liczba ograniczeń w każdej tabela, a także wyświetlanie wartości NULL dla tabel, które NIE mają żadnych ograniczeń. Z góry!SQL Server 2008 - Pobierz ograniczenia tabeli

To, co mam tak daleko:

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] 

Odpowiedz

81

Należy użyć bieżących sys Katalog widoki (jeśli jesteś na SQL Server lub nowszej - na sysobjects widoki są przestarzała i powinna należy unikać) - sprawdź numer extensive MSDN SQL Server Books Online documentation on catalog views here.

Istnieje sporo poglądy mogą Cię zainteresować:

  • sys.default_constraints dla domyślnych ograniczeń na kolumnach
  • sys.check_constraints do ograniczenia kontroli na kolumnach
  • sys.key_constraints kluczowych ograniczeń (np klucze podstawowe)
  • sys.foreign_keys dla relacji z kluczowymi obcokrajowcami

i wiele więcej - sprawdź to!

Możesz wysyłać zapytania i dołączać do tych widoków, aby uzyskać potrzebne informacje - np. to będzie lista tabel, kolumn i wszystkie ograniczenia domyślne zdefiniowane na nich:

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

Dzięki za pomoc marc, ale miałem nadzieję na kwerendę przy użyciu sysObjects sam. Czy istnieje sposób, aby dostosować moje zapytanie, aby uzyskać wymagane wyniki? – unos

+0

W zapytaniu wyświetlane jest tylko pierwsze ograniczenie z pierwszej tabeli. –

+0

@SteveStaple: nie, to nie ..... Używam tego cały czas - zawiera on ** wszystkie ** ograniczenia dla ** wszystkich ** tabel! Wypróbuj na AdventureWorks - otrzymuję 152 wiersze, a kilka tabel ma wiele ograniczeń, np. tabela "Pracownik" ma nie mniej niż sześć ograniczeń, z których wszystkie są pokazane ... –

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

Próbowałem edytować answer dostarczone przez marc_s jednak nie została przyjęta z jakiegoś powodu. Formatuje plik sql w celu łatwiejszego czytania, zawiera schemat oraz nazwę domyślną, dzięki czemu można go łatwo wkleić w innym kodzie.

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

użyłem następujące zapytanie w celu pobrania informacji o ograniczeniach w SQL Server 2012, i działa idealnie. Mam nadzieję, że przyda się wam.

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

You Can Get Z tego zapytania

UNIQUE,

Domyślnie Ograniczenie o wartości,

klucz obcy Z wymienionej tabeli i kolumny

And klucz podstawowy.

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

Dobra ... Dzięki ... – DineshDB

Powiązane problemy