Bonjour,
Pour un identifiant donné d'une table de ma base de données, je souhaite savoir si l'enregistrement correspondant à ce dernier est supprimable.
Plus simplement, je souhaite savoir si l'identifiant est présent dans d'autres tables liées via les contraintes.
Si l'enregistrement n'est pas supprimable, je dois renvoyer les liste des tables dans lesquelles l'identifiant est présent.
Via des recherches, j'ai trouvé le code suivant (merci elsuket) qui permet de retrouver les tables liées
Avec cette requête, je pensais faire quelque chose du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 ------------------------------- -- Nicolas SOUQUET - 09/11/2009 ------------------------------- SELECT PS.name + '.' + PT.name AS parent_table_name , PC.name AS parent_column_name , RS.name + '.' + RT.name AS referenced_table_name , RC.name AS referenced_column_name , FK.name AS foreign_key_name FROM sys.schemas AS PS INNER JOIN sys.foreign_keys AS FK ON PS.schema_id = FK.schema_id INNER JOIN sys.foreign_key_columns AS FKC ON FK.object_id = FKC.constraint_object_id INNER JOIN sys.tables AS PT ON FK.parent_object_id = PT.object_id INNER JOIN sys.columns AS PC ON FKC.parent_object_id = PC.object_id AND FKC.parent_column_id = PC.column_id INNER JOIN sys.tables AS RT ON FK.referenced_object_id = RT.object_id INNER JOIN sys.columns AS RC ON FKC.referenced_object_id = RC.object_id AND FKC.referenced_column_id = RC.column_id INNER JOIN sys.schemas AS RS ON RT.schema_id = RS.schema_id WHERE RT.name = 'NomDeMaTable'
Cette requête me renvoi un échec de conversion de la valeur nvarchar en type de donnés int, ce que je comprend.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT T.parent_table_name FROM ( -- ... -- Select du code précédent -- ... ) AS T WHERE T.parent_table_name + '.' + T.parent_column_name = MonIdentifiant
J'ai regardé le SQL dynamique mais je n'arrive pas à l'appliquer à cette requête.
Est-ce que ce traitement peut faire l'objet d'une requête ou dois-je impérativement passer par du SQL dynamique ?
Quelle piste pour le SQL dynamique ?
Merci.
Bitwin
Partager