Boucle de DELETE en fonction d'un SELECT

Boucle de DELETE en fonction d'un SELECT - SQL/NoSQL - Programmation

Marsh Posté le 29-05-2009 à 14:15:48    

Bonjour,

 

J'ai une question peut être un peu bête mais dont je n'arrive pas a trouver la réponse...

 

J'ai une base de données SQL Server dans laquelle je dois faire une série de DELETE dans des tables, tout ça en fonction d'un paramètre affai_id. On m'a filé une requête qui me permet de récupérer le nom des tables où est présent la colonne affai_id, je dois donc supprimer partout ou il y a cette colonne.

 

Sauf que je ne veux pas faire 50 delete from table where affai_id=param à la main mais plutôt le faire en automatique grâce au select.

 

Comment faire ça? J'ai essayé un curseur mais je n'ai pas tout saisi/réussi...

 

Merci d'avance.

 

EDIT: Je précise qu'il n'y a pas de schéma relationnel et qu'il y a environ 130 tables.


Message édité par Cheinz le 29-05-2009 à 15:08:42
Reply

Marsh Posté le 29-05-2009 à 14:15:48   

Reply

Marsh Posté le 29-05-2009 à 15:24:07    

Voilà ce que j'ai fais:

Code :
  1. BEGIN TRANSACTION Transa
  2. DECLARE @OLD_AFFAI VARCHAR(6)
  3. SELECT @OLD_AFFAI='037196'
  4. DECLARE @table_name varchar(50)
  5. DECLARE curseur_test CURSOR FOR
  6. SELECT TABLES.name AS "TABLE" FROM dbo.syscolumns as COLONNES
  7.  INNER JOIN dbo.sysobjects as TABLES
  8.  ON TABLES.ID = COLONNES.ID
  9.  INNER JOIN dbo.systypes AS TYPES
  10.  ON TYPES.xtype = COLONNES.xtype
  11.  WHERE TABLES.xtype = 'U'
  12.  and COLONNES.name like '%AFFAI_ID%'
  13. OPEN curseur_test
  14. FETCH curseur_test INTO @table_name
  15.  WHILE @@FETCH_STATUS = 0 BEGIN
  16.   PRINT @table_name
  17.   --delete from @table_name where affai_id=@OLD_AFFAI
  18.   FETCH NEXT FROM curseur_test INTO @table_name
  19.  END
  20. CLOSE curseur_test
  21. DEALLOCATE curseur_test
  22. ROLLBACK TRAN Transa


Cette requête marche et m'affiche les tables concernées.
 
Si j'enlève le commentaire sur la ligne de delete il me dit que @table_name n'est pas déclarée...

Reply

Marsh Posté le 29-05-2009 à 16:30:44    

Bon j'ai réussi en passant par une requête dynamique.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed