문제

유사하지만 동일하지는 않습니다 SQL Server 2000- 테이블의 외국 키 관계 쿼리

테이블 이름이 주어지면 SQL 2000이 작동하는 T-SQL 문이 필요합니다.

테이블 myfristtable에는 mysecondtable에 대한 외국 키가 있습니다. 여기서 myfirsttable.cola는 mysecondtable.colb에 있어야합니다. SQL 문 (또는 저장된 Proc)이 MyFirsttable을 위해 실행되고 라인에 결과 세트를 반환하면 기뻐할 것입니다.

Column | FK_Table      | FK_COLUMN
----------------------------------
ColA   | MySecondTable | ColB

NB: SQL 2005 용 샘플이 Sys.foreign_key_columns에 의존하기 때문에 작동하지 않습니다.

오히려 SP_HELP 문의 결과를 구문 분석 할 필요가 없습니다.

감사,

도움이 되었습니까?

해결책

DECLARE @tableName sysname

SET @tableName = '' -- Your table name goes here

SELECT
    c.name
    , target.name
    , targetc.name
FROM
    -- source table
    sysobjects t
    -- source column
    INNER JOIN syscolumns c ON t.id = c.id
    -- general constraint
    INNER JOIN sysconstraints co ON t.id = co.id AND co.colid = c.colid
    -- foreign key constraint
    INNER JOIN sysforeignkeys fk ON co.constid = fk.constid
    -- target table
    INNER JOIN sysobjects target ON fk.rkeyid = target.id
    -- target column
    INNER JOIN syscolumns targetc ON fk.rkey = targetc.colid AND fk.rkeyid = targetc.id
WHERE
    t.name = @tableName

노트 나는 SQL 2000에서 사용 가능한 시스템보기 만 사용했다고 생각하지만 (즉, SQL 2005 Sys.xxx Ones 대신 SYSXXX를 사용) 실제로 SQL 2005 EnvironEmnt에서만 테스트했습니다.

다른 팁

쿼리를 위해이 정확한 작업을 수행해야했으며 SYS 테이블 1과 매우 유사한 버전을 시도한 후이 저장된 절차를 발견했습니다.

exec sp_fkeys @fktable_name = 'foo'

이것은 사용할 수있는 것처럼 보입니다 SQL Server 2000. 또한 몇몇 경우 에이 저장된 Proc와 여기에서 쿼리 사이에 약간의 차이가 있음을 발견했습니다. 나는 sp_fkeys가 표준 버전이라고 생각합니다.

한 번은 이와 같은 것이 필요했기 때문에 시스템 저장 절차의 소스 코드를보고 필요한 것을 내 절차에 복사하여 필요한대로 작동하게했습니다.

sp_helpconstraint의 소스 코드를 볼 수 있습니다 ...

나는 이것을 Google에서 발견했다. 그래서이 일이 나의 장점이 아니라면. 도움이되기를 바랍니다

 SELECT 
        FK_Table  = FK.TABLE_NAME, 
        FK_Column = CU.COLUMN_NAME, 
        PK_Table  = PK.TABLE_NAME, 
        PK_Column = PT.COLUMN_NAME, 
        Constraint_Name = C.CONSTRAINT_NAME 
    FROM 
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
        INNER JOIN 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
            ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
        INNER JOIN 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
            ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
        INNER JOIN 
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
            ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
        INNER JOIN 
        ( 
            SELECT 
                i1.TABLE_NAME, i2.COLUMN_NAME 
            FROM 
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
                INNER JOIN 
                INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
                WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
        ) PT 
        ON PT.TABLE_NAME = PK.TABLE_NAME 

    WHERE PK.TABLE_NAME='something'    -- the table for you are asking
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top