문제

SQL Server 2005 에서이 SQL을 사용합니다

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

기본 키와 외래 키를 얻습니다.

외국 열쇠 만 얻으려면 어떻게해야합니까? 제약 조건이 기본 또는 외국 키인지 어떻게 알 수 있습니까?

감사

도움이 되었습니까?

해결책 2

SQL Server 2005와 함께 다음 SQL을 사용하여 기본 키로 제약 조건 이름을 얻었습니다.

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)

열쇠를 잡아 제약 이름을 얻으려면 :

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

제약으로 외국 키의 테이블과 필드를 얻으려면 :

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

제약 이름으로 기본 키의 테이블과 필드를 얻으려면 :

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)

다른 팁

훨씬 더 우아한 솔루션을 찾았습니다 여기

완전성을 위해 아래에 추가되었지만 모든 크레딧은 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

그리고 당신이 기본 키를 원한다면 ...

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

지금까지 내 이전 판에서 제거 되었기 때문에 이것을 추가 답변으로 추가했습니다. :)

DBM에 따라 다르지만 제약 조건에는 대상 테이블과 열이 어딘가에 있어야합니다.

외국 키 제약 조건 인 경우 대상 테이블은 현재 테이블과 다릅니다. 노력하다

select *

대신에

select constraint_name

작업 할 수있는 모든 마법 기둥을 보려면.

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

가장 우아한 솔루션은 아니지만 MS SQL Server는 PK & FK Prefix 이름 지정 컨벤션을 사용하여 같은 것을 사용할 수 있습니다.

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

그것이 당신의 dbms라면 :)

편집하다

Quassnoi의 답을 시도했을 때 "유효하지 않은 열 이름 '참조 _column_name'을 얻었습니다. 오류.

나는 그런 것을 사용합니다. SQL Server 2000에서도 작동합니다.

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

그것은 모두 잘 문서화 된 시스템 테이블과보기에 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top