SQL 2000: T-SQL para obter relações de chave estrangeira para uma tabela
-
06-07-2019 - |
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 ??strong>: 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,
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