Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/07/2008, 16h43   #1
Membre à l'essai
 
Inscription : novembre 2005
Messages : 41
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 41
Points : 23
Points : 23
Par défaut Comment récupérer l'identifiant d'une ligne en erreur lors d'un update

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 :
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
backseatgreg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2008, 12h32   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 793
Points : 17 793
Par nature une requête est ensembliste. L'erreur porte donc sur la requête globalement et non sur une ligne précise. Si vous voulez savoir la ligne en cause il faut un code qui insère ligne à ligne par exemple à l'aide d'un curseur.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h49.


 
 
 
 
Partenaires

Hébergement Web