SQL 2000 : 테이블에 대한 외국 키 관계를 얻는 T-SQL
-
06-07-2019 - |
문제
유사하지만 동일하지는 않습니다 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