SQL comment interrogez-vous les tables qui font reference à une valeur de key étrangère spécifique?

J'ai la table A avec une key primaire sur l' ID colonne et les tables B,C,D... qui ont 1 ou plusieurs colonnes avec des relations de key étrangère à A.ID

Comment écrire une requête qui me montre toutes les tables qui contiennent une valeur spécifique (par exemple 17 ) de la key primaire?

Je voudrais avoir un code SQL générique qui peut prendre un nom de table et une valeur de key primaire et afficher toutes les tables qui referencent cette valeur spécifique via une key étrangère.

Le résultat devrait être une list de noms de tables .

J'utilise MS SQL 2012.

Pas un idéal, mais devrait returnner ce qui est nécessaire (list des tables):

 declare @tableName sysname, @value sql_variant set @tableName = 'A' set @value = 17 declare @sql nvarchar(max) create table #Value (Value sql_variant) insert into #Value values (@value) create table #Tables (Name sysname, [Column] sysname) create index IX_Tables_Name on #Tables (Name) set @sql = 'declare @value sql_variant select @value = Value from #Value ' set @sql = @sql + replace(( select 'insert into #Tables (Name, [Column]) select ''' + quotename(S.name) + '.' + quotename(T.name) + ''', ''' + quotename(FC.name) + ''' where exists (select 1 from ' + quotename(S.name) + '.' + quotename(T.name) + ' where ' + quotename(FC.name) + ' = @value) ' from sys.columns C join sys.foreign_key_columns FKC on FKC.referenced_column_id = C.column_id and FKC.referenced_object_id = C.object_id join sys.columns FC on FC.object_id = FKC.parent_object_id and FC.column_id = FKC.parent_column_id join sys.tables T on T.object_id = FKC.parent_object_id join sys.schemas S on S.schema_id = T.schema_id where C.object_id = object_id(@tableName) and C.name = 'ID' order by S.name, T.name for xml path('')), '
', CHAR(13)) --print @sql exec(@sql) select distinct Name from #Tables order by Name drop table #Value drop table #Tables 

Vous voulez regarder sys.foreignkeys . Je voudrais commencer à partir de http://blog.sqlauthority.com/2009/02/26/sql-server-2008-find-relationship-of-foreign-key-and-primary-key-using-t-sql-find- tables-avec-foreign-key-constraint-in-database /

pour donner quelque chose comme

 declare @value nvarchar(20) = '1' SELECT 'select * from ' + QUOTENAME( SCHEMA_NAME(f.SCHEMA_ID)) + '.' + quotename( OBJECT_NAME(f.parent_object_id) ) + ' where ' + COL_NAME(fc.parent_object_id,fc.parent_column_id) + ' = ' + @value FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id 

Vous pourriez get cela en écrivant un peu de SQL. Je post un exemple, mais c'est juste une maquette montrant la façon dont vous pourriez le faire.

 CREATE TABLE tempTable ( TABLE_NAME varchar(255) ); CREATE UNIQUE CLUSTERED INDEX Idx_tempTable ON tempTable(TABLE_NAME); DECLARE @var2 nvarchar(max) INSERT INTO tempTable SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%COLUMN_NAME%' /*FOREACH result of the tempTable you could find if the COLUMN_NAME of the result(table) has the value you want*/ SET @var2 = 'SELECT TABLE_NAME FROM ' + tempTableResult + ' WHERE COLUMN_NAME=VALUE' exec(@var2) DROP TABLE tempTable