2013-01-09 25 views
50

Können Sie mir helfen, eine Abfrage zu erstellen, die die Einschränkungen in allen Tabellen abruft, die Anzahl der Einschränkungen in jeder Tabelle und NULL für Tabellen anzeigt, die KEINE Einschränkungen haben. Danke im Voraus!SQL Server 2008 - Tabelleneinschränkungen abrufen

Dies ist, was ich bisher:

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] 

Antwort

81

Sie sollten die aktuellen sys Katalogansichten verwenden (wenn Sie auf SQL Server 2005 oder höher sind - die sysobjects Ansichten sind veraltet und sollte vermieden werden) - überprüfen Sie die extensive MSDN SQL Server Books Online documentation on catalog views here.

Es gibt durchaus ein paar Ansichten, die Sie interessieren könnten:

  • sys.default_constraints für Standardeinschränkungen auf Spalten
  • sys.check_constraints für Check-Einschränkungen für Spalten
  • sys.key_constraints für Schlüsseleinschränkungen (zB Primärschlüssel)
  • sys.foreign_keys für Fremdschlüsselbeziehungen

und ein viel mehr - check it out!

Sie können diese Ansichten abfragen und beitreten, um die benötigten Informationen zu erhalten - z. dies wird die Tabellen, Spalten und alle Standardeinschränkungen auf ihnen definierten Liste:

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

Vielen Dank für Ihre Hilfe Marc, aber ich hatte auf eine Abfrage mit sysObjects selbst gehofft. Gibt es eine Möglichkeit, meine Abfrage zu optimieren, um die erforderlichen Ergebnisse zu erhalten? – unos

+0

Ihre Abfrage listet nur die erste Einschränkung in der ersten Tabelle auf. –

+0

@SteveStaple: Nein, tut es nicht ..... Ich benutze dies die ganze Zeit - es listet ** alle ** Einschränkungen für ** alle ** Tabellen! Versuchen Sie es auf "AdventureWorks" - ich bekomme 152 Zeilen, und mehrere Tabellen haben mehrere Einschränkungen, z. Die Tabelle "Employee" enthält nicht weniger als sechs Einschränkungen, die alle gut dargestellt werden .... –

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

Ich habe versucht, die answer zur Verfügung gestellt von marc_s zu bearbeiten aber es aus irgendeinem Grund nicht angenommen wurde. Es formatiert die SQL-Datei zum leichteren Lesen, enthält das Schema und nennt auch den Standardnamen, damit dieser einfach in anderen Code eingefügt werden kann.

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

Ich verwendete die folgende Abfrage, um die Informationen von Einschränkungen in SQL Server 2012 abzurufen, und funktioniert einwandfrei. Ich hoffe, es wäre nützlich für dich.

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

Sie können

Einzigartig Constraint,

Standard Constraint mit dem Wert,

Fremdschlüssel mit referenzierten Tabellen und Spalten

Und Primary Key Constraint mit dieser Abfrage Get.

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

Gut eins ... Danke ... – DineshDB