뷰를 사용하여 문제의 행을 표시하는 SELECT 문을 생성 할 수 있습니다. 나는이 질문에 제공된 테이블에 대해서만 이것을 테스트했지만, 키가 여러 컬럼 인 경우 작동하도록 확장 될 수 있습니다.
declare @table_schema nvarchar(50) = 'dbo',
@table_name nvarchar(50) = 'TableA',
@id int = 1
select fk_col.TABLE_SCHEMA, fk_col.TABLE_NAME, fk_col.COLUMN_NAME,
'select * from ' + fk_col.TABLE_SCHEMA + '.' + fk_col.TABLE_NAME + ' t1 '
+ ' inner join ' + @table_schema + '.' + @table_name + ' t2 '
+ ' on t1.' + fk_col.COLUMN_NAME + ' = t2.' + pk_col.COLUMN_NAME
+ ' where t2.' + pk_col.COLUMN_NAME + ' = ' + cast(@id as nvarchar)
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk
join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE pk_col
on pk.CONSTRAINT_SCHEMA = pk_col.CONSTRAINT_SCHEMA
and pk.CONSTRAINT_NAME = pk_col.CONSTRAINT_NAME
join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS fk
on pk.CONSTRAINT_SCHEMA = fk.UNIQUE_CONSTRAINT_SCHEMA
and pk.CONSTRAINT_NAME = fk.UNIQUE_CONSTRAINT_NAME
join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE fk_col
on fk_col.CONSTRAINT_SCHEMA = fk.CONSTRAINT_SCHEMA
and fk_col.CONSTRAINT_NAME = fk.CONSTRAINT_NAME
where pk.TABLE_SCHEMA = @table_schema
and pk.TABLE_NAME = @table_name
and pk.CONSTRAINT_TYPE = 'PRIMARY KEY'
생성 된 선택 문 :
select * from dbo.TableB t1 inner join dbo.TableA t2 on t1.TableAId = t2.Id where t2.Id = 1
select * from dbo.TableC t1 inner join dbo.TableA t2 on t1.TableAId = t2.Id where t2.Id = 1
및 쿼리 결과 :
Id TableAId Id
----------- ----------- -----------
1 1 1
2 1 1
Id TableAId Id
----------- ----------- -----------
1 1 1
당신의 목표는 완전히 명확하지 않다. 테이블 간의 외래 키 realtion 배송을 식별하기위한 메타 데이터를 찾고 싶습니까? 아니면 외래 키 관계를 이미 알고있는 데이터를 찾기 위해 TSql 쿼리를 원하십니까? – user957902
나는 메타 데이터에 관심이 없다. 필자는 예제에서 다른 특정 행에 대한 종속성이있는 특정 행과 테이블을 결정하는 방법에 대해 설명합니다. 목표 테이블과 함께 가능한 모든 테이블을 조인하는 엄청난 select 문을 작성하지 않고이 정보를 얻고 싶습니다. –