Bonjour à tous.

Pour commencer, nous travaillons sur SQLServer 2008
pour un de nos traitements quotidiens, nous devons traité des fichiers xml issus du site icecat (pour intégration d'un catalogue de produits).

Pour cela j'integre les fichiers à traiter dans une table de traitement "T_fiche_Icecat"

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
CREATE TABLE [dbo].[T_Fiche_Icecat](
	[Fiche_IcecatId] [bigint] IDENTITY(1,1) NOT NULL,
	[ContenuXML] [xml] NULL,
	[etat] [varchar](15) NULL,
	[NomFic] [varchar](255) NOT NULL,
	[DateDebutIntegr] [datetime] NULL,
	[DateFinIntegr] [datetime] NULL,
	[ErrorNumber] [bigint] NULL,
	[ErrorMessage] [varchar](1000) NULL
) ON [PRIMARY]
 
/****** Object:  Index [PK_T_Fiche_Icecat]    Script Date: 06/17/2015 08:53:23 ******/
ALTER TABLE [dbo].[T_Fiche_Icecat] ADD  CONSTRAINT [PK_T_Fiche_Icecat] PRIMARY KEY CLUSTERED 
	(
	[Fiche_IcecatId] ASC
	)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
/****** Object:  Index [UQ_nomfic]    Script Date: 06/17/2015 08:53:23 ******/
ALTER TABLE [dbo].[T_Fiche_Icecat] ADD  CONSTRAINT [UQ_nomfic] UNIQUE NONCLUSTERED 
	(
	[NomFic] ASC
	)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
ensuite je requete le contenu xml des différents noeuds pour intégration dans des tables.
Par exemple pour le noeud productdescription j’exécute:
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
 
insert into ICE_ProductDescription
select   C.value('../@ID','Bigint') ProductID
	,C.value('../@Prod_id','nvarchar(255)') as Prod_id	--  Prod_id="452679-B21"
	,C.value('./@ID','int') ProductDescriptionID
	,C.value('./@LongDesc','nvarchar(4000)') LongDesc
	,C.value('./@ManualPDFSize','int') ManualPDFSize	
	,C.value('./@ManualPDFURL','nvarchar(512)') ManualPDFURL	
	,C.value('./@PDFSize','int') PDFSize	
	,C.value('./@PDFURL','nvarchar(512)') PDFURL	
	,C.value('./@ShortDesc','nvarchar(512)') ShortDesc	
	,C.value('./@URLr','nvarchar(512)') URL	
	,C.value('./@WarrantyInfo','nvarchar(512)') WarrantyInfo
	,LP.LGU_ID langid	
from T_Fiche_Icecat T 
	CROSS APPLY T.ContenuXML.nodes('ICECAT-interface/Product/ProductDescription') AS T_XML(C)	
		join LANGUE_PROD LP on LP.LGU_ID_ICE=C.value('./@langid','int')
		left join ICE_ProductDescription PD on PD.ProductID =C.value('../@ID','int')
							and PD.ProductDescriptionID =C.value('./@ID','int')
							and PD.langid =LP.LGU_ID 
where	ContenuXML.exist('ICECAT-interface/Product/ProductDescription')=1
	and PD.ProductID is null
comme nous n'avons pas la même table de langue, je suis obligé de passer par une table de mapping LANGUE_PROD.

Ces requêtes tournent en prod depuis plus de 6 mois sans soucis.
Aujourd'hui, nous avons des fichiers xml qui font planté le traitement et je ne comprend pas le problème et donc je ne sais pas le résoudre.

le fichier est le suivant:
463182.txt
j'ai du mettre le fichier en txt car en xml j'avais un rejet à l'upload.
l'erreur est la suivante:

Msg*0, Niveau*11, État*0, Ligne*0
Une erreur grave s'est produite sur la commande actuelle. Les résultats éventuels doivent être ignorés.
Msg*0, Niveau*20, État*0, Ligne*0
Une erreur grave s'est produite sur la commande actuelle. Les résultats éventuels doivent être ignorés.
Le problème vient de la lecture xml car la requête suivante plante également (même erreur) et ne fait pas référence aux tables à alimenter:
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
select  T.*
		,C.value('../@ID','Bigint') ProductID
		,C.value('../@Prod_id','nvarchar(255)') as Prod_id	--  Prod_id="452679-B21"
		,C.value('./@ID','int') ProductDescriptionID
		,C.value('./@LongDesc','nvarchar(4000)') LongDesc
		,C.value('./@ManualPDFSize','int') ManualPDFSize	
		,C.value('./@ManualPDFURL','nvarchar(512)') ManualPDFURL	
		,C.value('./@PDFSize','int') PDFSize	
		,C.value('./@PDFURL','nvarchar(512)') PDFURL	
		,C.value('./@ShortDesc','nvarchar(512)') ShortDesc	
		,C.value('./@URL','nvarchar(512)') URL	
		,C.value('./@WarrantyInfo','nvarchar(512)') WarrantyInfo
						--,LP.LGU_ID langid	
	from T_Fiche_Icecat T 
		CROSS APPLY T.ContenuXML.nodes('ICECAT-interface/Product/ProductDescription') AS T_XML(C)
A priori, c'est la lecture de l'attribut @URL qui plante car quand je commente la ligne, la requête se termine sans soucis.

EDIT:
en fait non, car si j'execute
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
select  T.*
		,C.value('../@ID','Bigint') ProductID
		,C.value('../@Prod_id','nvarchar(255)') as Prod_id	--  Prod_id="452679-B21"
		,C.value('./@ID','int') ProductDescriptionID
		--,C.value('./@LongDesc','nvarchar(4000)') LongDesc
		--,C.value('./@ManualPDFSize','int') ManualPDFSize	
		--,C.value('./@ManualPDFURL','nvarchar(512)') ManualPDFURL	
		--,C.value('./@PDFSize','int') PDFSize	
		--,C.value('./@PDFURL','nvarchar(512)') PDFURL	
		--,C.value('./@ShortDesc','nvarchar(512)') ShortDesc	
		,C.value('./@URL','nvarchar(512)') URL	
	--	,C.value('./@WarrantyInfo','nvarchar(512)') WarrantyInfo
						--,LP.LGU_ID langid	
	from T_Fiche_Icecat T 
		CROSS APPLY T.ContenuXML.nodes('ICECAT-interface/Product/ProductDescription') AS T_XML(C)
ça passe. par contre si je rajoute une autre colonne ça plate :s
/EDIT
Dans le fichier , le noeud productDescription est vide. Normalement ca ne devrait pas poser de soucis.

Je ne sais pas si les infos seront suffisantes pour identifier le problème donc je reste à votre disposition.

Merci d'avance.