Bonjour,

J'ai fait une requête qui me permet d'extraire des lignes d'un champ stockant les logs d'une application. Sur chaque ligne ce champs stocke l'ensemble des traitements et donc des erreurs. Ayant besoin de récupérer que les lignes de ce champs indiquant "erreur" puis d'enrichir ca avec d'autres infos (nom de tache, nom de la société), j'ai adapté ma requête pour traiter ces points.

Cela fonctionne parfaitement.

Je ne suis pas du tout un expert en SQL et en développement mais je pense que j'ai une étape qui pourrait disparaitre dans le code ci-dessous.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
SET QUOTED_IDENTIFIER ON
GO
 
-----------------------------------------------------------------------------------------------------------------------------------------
---- Tables temporaires nécessaires au script (seront supprimées à la fin du traitement)
-----------------------------------------------------------------------------------------------------------------------------------------
CREATE TABLE #TABLE_TEMP1
( DETAIL  [VARCHAR] (max),
  ID_TRAITEMENT [VARCHAR] (128)
)
 
CREATE TABLE #TABLE_TEMP2
( ENTITE [VARCHAR] (128),
  TRAITEMENT_LIBELLE [VARCHAR] (128),
  DETAIL  [VARCHAR] (max) ,
)
 
-----------------------------------------------------------------------------------------------------------------------------------------
---- Déclaration des variables et du curseur
-----------------------------------------------------------------------------------------------------------------------------------------
DECLARE @ID_TRAITEMENT NVARCHAR(MAX)
DECLARE @GETID CURSOR
SET @GETID = CURSOR FOR
 
--------------------------------------------------------------
---- Liste des ID en erreur trouvés
--------------------------------------------------------------
SELECT DISTINCT S.ID
FROM TTRAITEMENT
WHERE statut = 'échec'
 
-----------------------------------------------------------------------------------------------------------------------------
---- Lancement du curseur pour boucler sur chaque ID trouvé
-----------------------------------------------------------------------------------------------------------------------------
OPEN @GETID
FETCH NEXT
FROM @GETID INTO @ID_TRAITEMENT
WHILE @@FETCH_STATUS = 0
BEGIN
 
DECLARE @SOURCE NVARCHAR(MAX)
DECLARE @SEPARATEUR CHAR(2)
DECLARE @CHAINEXML XML
DECLARE @CHAINE NVARCHAR(MAX)
 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------- Construction de la chaine XML avec le retraitement des retours chariot en balise
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
SET @SOURCE= (SELECT DETAIL FROM TTRAITEMENT WHERE TTRAITEMENT.ID = @ID_TRAITEMENT)
 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------- Variable permettant de retraiter dans l'étape suivante les retour chariot présent dans le resultat @source
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
SET @SEPARATEUR = CHAR(13)+CHAR(10)
 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------- Construction de la chaine XML avec le retraitement des retours chariot en balise
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT @CHAINEXML = CONVERT(XML,'<ROOT><NIVEAU>' + REPLACE(@SOURCE,@SEPARATEUR,'</NIVEAU> <NIVEAU>') + '</NIVEAU></ROOT>')
 
--------------------------------------------------------------------------------------------------------------------------------------------
--------- Stockage du résultat de la chaine XML dans une table temporaire #TABLE_TEMP1
--------------------------------------------------------------------------------------------------------------------------------------------
INSERT INTO #TABLE_TEMP1
(DETAIL,
ID_TRAITEMENT)
SELECT VALUE AS DETAIL,
@ID_TRAITEMENT AS ID_TRAITEMENT
FROM (
	SELECT [VALUE] = RESULTAT.C.value('.','VARCHAR(250)')
	FROM @CHAINEXML.nodes('/ROOT/NIVEAU') RESULTAT(C)
	) T1
WHERE T1.VALUE LIKE 'Erreur  sur la ligne : %'
 
    FETCH NEXT
    FROM @GETID INTO @ID_TRAITEMENT
END
 
CLOSE @GETID
DEALLOCATE @GETID
 
---------------------------------------------------------------------------------------------------------------------------------------------------------------
--------- Enrichissement des informations présentes dans la table #TABLE_TEMP1
---------------------------------------------------------------------------------------------------------------------------------------------------------------
INSERT INTO #TABLE_TEMP2
 (DETAIL,
TRAITEMENT_LIBELLE,
ENTITE)
SELECT T1.DETAIL , T2.LIBELLE, T3.LIBELLE
FROM #TABLE_TEMP1 T1
INNER JOIN TTRAITEMENT T2 ON T1.ID_TRAITEMENT =T2.ID
INNER JOIN TSOCIETE T3 ON T2.ID_SOCIETE = T3.ID
 
SELECT * FROM #TABLE_TEMP2
L'étape d'insert dans la table #TABLE_TEMP2 avec l'ajout d'informations.
Je me demande si il n'est pas possible de récupérer l'ensemble des infos à ce moment là (Ligne 50) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
SET @SOURCE= (SELECT DETAIL FROM TTRAITEMENT WHERE TTRAITEMENT.ID = @ID_TRAITEMENT)

J'ai trouvé une page pouvant m'aider sur les variables et traiter plusieurs champs :
https://www.mssqltips.com/sqlservert...in-sql-server/

j'ai donc remplacé ma ligne 50 par :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
DECLARE @DETAIL NVARCHAR(MAX)
DECLARE @TRAITEMENT_LIBELLE NVARCHAR(128)
DECLARE @ENTITE NVARCHAR(128)
 
SELECT @DETAIL= T1.DETAIL, @TRAITEMENT_LIBELLE = T2.LIBELLE, @ENTITE = T3.LIBELLE
				FROM TTRAITEMENT  T1
				INNER JOIN TTRAITEMENT  T2 ON T1.ID =T2.ID
				INNER JOIN TENTITE T3 ON T2.ID_ENTITE = T3.ID
				WHERE T1.statut = 'échec'
				AND TTRAITEMENT.ID = @ID_TRAITEMENT)
Je n'arrive pas à voir comment faire et insérer le résultat dans la table #TABLE_TEMP2 directement sans passer par l'étape de la table #TABLE_TEMP1 qui semble une perte de temps.

Je ne sais pas si ma demande est clair, mais je veux bien quelques conseils !