Pergunta

semelhante, mas não idêntico ao SQL Server 2000 - Consulta a relações de chave estrangeira da tabela

Eu preciso de uma declaração T-SQL que irá trabalhar SQL 2000 que, dado um nome de tabela, irá retornar as relações de chave estrangeira para a tabela por exemplo.

Table MyFristTable tem uma chave estrangeira para MySecondTable, onde MyFirstTable.ColA deve estar em MySecondTable.ColB. Eu ficaria encantado, se a instrução SQL (ou proc armazenado) é funcionou por MyFirstTable e retornou um conjunto de resultados nas linhas de

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

Nota : Eu tenho amostras para SQL 2005 que não vai funcionar porque eles dependem de sys.foreign_key_columns

Eu prefiro não ter de analisar os resultados da instrução sp_help.

Obrigado,

Foi útil?

Solução

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

NOTA eu tenho Acho usado apenas os pontos de vista de sistema disponíveis no SQL 2000 (ou seja, aqueles sysXXX em vez dos sys.XXX SQL 2005) Mas eu só tenho realmente testado isso em um SQL 2005 environemnt.

Outras dicas

Eu tive que fazer esta coisa exata para uma consulta, e eu achei este procedimento armazenado, depois de tentar uma versão muito parecida com a tabela sys:

exec sp_fkeys @fktable_name = 'foo'

Parece que este está disponível em SQL Server 2000 . Além disso, descobri que em alguns casos existem pequenas diferenças entre este proc armazenados e as consultas aqui. Eu estou supondo sp_fkeys é a versão canônica.

Eu precisava de algo assim uma vez, então eu apenas olhou para o código-fonte do procedimento armazenado sistema e copiou o que eu precisava para o meu próprio procedimento e fez funcionar como eu precisava.

Você pode olhar para o código-fonte do sp_helpconstraint ...

Eu encontrei isso no google ... por isso, se este trabalho não é meu mérito. Esperança que ajuda

 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top