Bonjour,
on me demande de loguer le résultat d'une requête, afin de savoir quels enregistrements posent problèmes, sachant que les requêtes vont insérer des tables entières ( et je suis sous sql 2005).
Basiquement ma requête était:
(J'insère dans la nouvelle table, tout ce qui n'existe pas déjà).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 INSERT afm.bl(bl_id,name,site_id,cost_sqft,dwgname,ehandle,lat,lon) SELECT bl_id,name,site_id,cost_sqft,dwgname,ehandle,lat,lon FROM afm.afm1_bl WHERE afm.afm1_bl.bl_id NOT IN (SELECT bl_id FROM afm.bl )
Ensuite on me demande de loguer les erreurs dans une autre table..
Et la j'ai l'impression que je suis tombé dans une usine et je sais pas si j'ai trouvé une bonne solution(même si ca semble bien marcher).
Pouvez-vous me conseiller ?
J'ai pas encore fais le traitement dans le "catch" mais je vais insérer les infos que j'affiche là dans une autre table.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 CREATE PROCEDURE afm.afm1_insert_all AS DECLARE @myBLID varchar(50); DECLARE myCursor CURSOR FOR SELECT bl_id FROM afm.afm1_bl order by bl_id WHERE afm.afm1_bl.bl_id NOT IN (SELECT bl_id FROM afm.bl ); OPEN myCursor; FETCH NEXT FROM myCursor into @myBLID; insert_block: BEGIN TRY WHILE @@FETCH_STATUS= 0 BEGIN INSERT INTO afm.bl (bl_id,name,site_id,cost_sqft,dwgname,ehandle,lat,lon) SELECT bl_id,name,site_id,cost_sqft,dwgname,ehandle,lat,lon FROM afm.afm1_bl WHERE afm.afm1_bl.bl_id = @myBLID FETCH NEXT FROM myCursor into @myBLID; END END TRY BEGIN CATCH select ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_MESSAGE() AS ErrorMessage, @myBLID as bl_id; FETCH NEXT FROM myCursor into @myBLID; GOTO insert_block END CATCH CLOSE myCursor DEALLOCATE myCursor
Donc une grosse procédure pour :
- voir l'enregistrement qui pose souci (la clé primaie = bl_id)
- une fois l'erreur levée, continuer le traîtement avec les autres enregistrements.
Estce que mon raisonnement est juste ?
Est-ce qu'on peut mieux faire et plus simplement ? J'ai pas mal de tables à faire selon ce principe, et ce n'est que les Inserts..
Au départ je voulais faire une procédure "insert" avec toutes mes requêtes d'insertions et avoir un TRY/Catch pour tout qui me remontrerai l'erreur, la table concernée et l'enregistrement (mais là je suis paumé).
Partager