Bonjour,

Lors de la copie d'une table vers une autre je tombe sur des exception de cast. J'ai donc englobé le tout d'un TRY CATCH pour pouvoir logguer ces erreurs.

Je dois donc récupérer l'id de la ligne en erreur pour savoir laquelle a une valeur qui ne se cast pas.

J'ai un code du style :

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
DECLARE @imp_id Int
SET @imp_id='193'
DECLARE @trans_id Int
SET @trans_id='4'
DECLARE @error_label_fr NVarChar (4000)
SET @error_label_fr='col_c : Erreur à la copie.'
DECLARE @error_label_en NVarChar (4000)
SET @error_label_en='col_c : Error when copying.'
 
   BEGIN TRY
   UPDATE transformed
       SET transformed.col_c = COALESCE(transformed.col_c, origin.col_c)
       FROM x_etl_test_nosys_transformed transformed
       INNER JOIN x_etl_test_nosys_origin origin
           ON origin.impline_id = transformed.impline_id
       WHERE transformed.imp_id = @imp_id
   END TRY
 
   BEGIN CATCH
   INSERT INTO x_etl_test_nosys_errors
   (impline_id, imp_id, trans_id, error_label_fr, error_label_en)
   SELECT impline_id, @imp_id, @trans_id, @error_label_fr + ' : ' + ERROR_MESSAGE(), @error_label_en + ' : ' + ERROR_MESSAGE()
   FROM (
       SELECT RANK() OVER(ORDER BY transformed.impline_id ASC) AS line_number, transformed.impline_id
           FROM x_etl_test_nosys_transformed transformed
           INNER JOIN x_etl_test_nosys_origin origin
               ON origin.impline_id = transformed.impline_id
           WHERE transformed.imp_id = @imp_id) AS t
       WHERE t.line_number = ERROR_LINE() - 1
   END CATCH
Je pensai que ERROR_LINE() retournait le numéro de la ligne en erreur dans l'ordre d'execution du update alors qu'en fait ça retourne la ligne du code de la requête en "erreur" (bien que ce ne soit pas la requête en elle même qui soit en erreur).

Comment puis-je faire pour savoir quelle ligne me pose un probleme d'invalid cast ? Comment récupérer son identifiant ?

(je suis sous SQL SERVER 2005 si celà peut apporter une solution plus facilement)

Merci,
Greg