Frage

Mit dieser SQL auf SQL Server 2005

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName

Ich bekomme die Primärschlüssel und die Fremdschlüssel.

Wie kann ich nur Fremdschlüssel? Wie kann ich sehen, ob ein Constraint ist ein primärer oder ein Fremdschlüssel?

Danke

War es hilfreich?

Lösung 2

Ich habe die folgende SQL mit SQL Server 2005 den Constraint-Namen von Primärschlüssel zu erhalten:

SELECT Constraint_Name 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
WHERE UNIQUE_CONSTRAINT_NAME = 
   (SELECT CONSTRAINT_NAME 
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
    WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)

Um den Constraint-Namen von Foreing Key zu erhalten:

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName

Um den Fremdschlüssels der Tabelle und Feld durch Constraint-Namen zu erhalten:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = @ConstraintName

Um den Primärschlüssels der Tabelle und Feld durch Constraint-Namen zu erhalten:

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE CONSTRAINT_NAME = 
    (SELECT UNIQUE_CONSTRAINT_NAME 
     FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
     WHERE CONSTRAINT_NAME = @ConstraintName)

Andere Tipps

Gefunden eine viel elegantere Lösung hier

-Code hinzugefügt unten auf Vollständigkeit, sondern alle Kredit geht an Pinal Dave

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, 
   fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, 
   fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
LEFT JOIN sys.foreign_key_columns AS fc
   ON f.OBJECT_ID = fc.constraint_object_id

Und wenn Sie nur die Primärschlüssel wollen ...

SELECT i.name AS IndexName,
        OBJECT_NAME(ic.OBJECT_ID) AS TableName,
        COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i
        INNER JOIN sys.index_columns AS ic
        ON i.OBJECT_ID = ic.OBJECT_ID 
    AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1

Als weitere Antwort hinzugefügt, weil es aus meinem vorherigen entfernt, so weit ist:)

Es hängt von Ihrem DBMS aber eine Einschränkung soll die Zieltabelle und Spalte irgendwo hat.

Wenn es ein Fremdschlüssel ist, wird die Zieltabelle der aktuellen Tabelle unterschiedlich sein. Versuchen

select *

statt

select constraint_name

alle magischen Spalten zu sehen, Sie arbeiten kann.

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
  AND COLUMN_NAME=@ColumnName
  AND REFERENCED_COLUMN_NAME IS NOT NULL

Es ist nicht die eleganteste Lösung, aber MS SQL Server verwendet die PK & FK Präfix Konvention für Schlüssel zu benennen, so dass Sie so etwas wie ...

verwenden könnten
SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'

Wenn das DBMS:)

Bearbeiten

Wenn ich die Antwort von Quassnoi versuchte ich bekam eine „Ungültiger Spaltenname‚REFERENCED_COLUMN_NAME‘.“ Fehler.

Ich benutze so etwas. Es funktioniert in SQL Server 2000 als auch.

select  object_name(fkx.constid) as fk_name,
        fkx.keyno as num,
        object_name(fkx.fkeyid) as child_table,
        col_name(fkx.fkeyid, fkx.fkey) as child_column,
        object_name(fkx.rkeyid) as parent_table,
        col_name(fkx.rkeyid, fkx.rkey) as parent_column
from sysforeignkeys fkx
order by fk_name, fkx.keyno

Es ist alles in Systemtabellen und Ansichten, die recht gut dokumentiert sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top