Bonjour,
1. Dans un a applicatif je pose des fichiers xml dans un répertoire.
2. Ensuite je lis ces fichiers xml pour les intégrer dans une table.
J'ai un programme externe qui tourne et pool sur le répertoire afin de lire tout les fichiers present dans ce répertoire (je ne sais pas comment faire cela directement dans sql server).
J'ai donc le premier script qui a le contenu suivant :
Puis le second (qui est appeler par le premier) :
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 LOADXML USE [mattec-epobus] GO /****** Object: StoredProcedure [dbo].[usp_LoadXML] Script Date: 02/14/2011 16:52:43 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= ALTER PROCEDURE [dbo].[usp_LoadXML](@XMLInputFile varchar(300)) AS --DECLARE @xmlInputFile varchar(300) --set @xmlInputFile = 'd:\General_Input\FAILED_FR08_epobus_MATTEC_PROD_DECLARATION_8.xml' BEGIN DECLARE @UniqueID int DECLARE @ID int DECLARE @MessageType varchar(1) DECLARE @MessageDetail varchar(50) DELETE FROM XMLImport EXEC usp_ImportXML @XMLInputFile INSERT INTO [XMLInputData]( [ID], [mat_doc], [message], [pstng_date], [doc_date], [type], [system]) SELECT tab.col.value('./unique[1]','varchar(50)') AS 'ID', tab.col.value('./mat_doc[1]','varchar(50)') AS 'mat_doc', tab.col.value('./message[1]','varchar(200)') AS 'message', tab.col.value('./pstng_date[1]','varchar(50)') AS 'pstng_date', tab.col.value('./doc_date[1]','varchar(50)') AS 'doc_date', tab.col.value('./type[1]','varchar(1)') AS 'type', tab.col.value('./system[1]','varchar(50)') AS 'system' FROM [XMLImport] CROSS APPLY xml_data.nodes('//result') AS tab(col) Set @UniqueID = (Select Max(UniqueID) from XMLInputData) set @ID = (Select ID from XMLInputData where UniqueID = @UniqueID) set @MessageType = (Select type from XMLInputData where UniqueID = @UniqueID) set @MessageDetail = (Select message from XMLInputData where UniqueID = @UniqueID) UPDATE XMLInputData set Processdate = getdate() where UniqueID = @UniqueID UPDATE dbo.ShiftExportToSAP set status = (case when @Messagetype = 'E' THEN 3 ELSE 2 END), [Message Type]=@MessageType, [Message Detail]=@MessageDetail Where dbo.ShiftExportToSAP.ShiftExportToSAPID = @ID END
J'ai un programme externe qui appelle pour chaque fichier present dans le repertoire le script LOADXML. Or il s'averes que cela bloques sur le deuxieme script lorsque l'appel viens de l’extérieur.
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 IMPORTXML USE [mattec-epobus] GO /****** Object: StoredProcedure [dbo].[usp_ImportXML] Script Date: 02/14/2011 16:53:24 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= ALTER PROCEDURE [dbo].[usp_ImportXML](@xmlInputFile varchar(300)) AS BEGIN --DECLARE @xmlInputFile varchar(300) --set @xmlInputFile = 'D:\General_Input\FAILED_FR08_epobus_MATTEC_PROD_DECLARATION_6.xml' --INSERT INTO [Table_2]( --[test_001]) --SELECT @xmlInputFile as 'test_001' EXEC('INSERT INTO XMLImport(xmlFileName, xml_data) SELECT ''' + @xmlInputFile + ''', xmlData FROM ( SELECT * FROM OPENROWSET ( BULK ''' + @xmlInputFile + ''', SINGLE_BLOB) AS XMLDATA) AS FileImport (XMLDATA)') END
La routine 'EXEC('INSERT INTO XMLImport(xmlFileName, xml_data)
a priori ne se fait pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT ''' + @xmlInputFile + ''', xmlData FROM ( SELECT * FROM OPENROWSET ( BULK ''' + @xmlInputFile + ''', SINGLE_BLOB) AS XMLDATA) AS FileImport (XMLDATA)')'
Par contre si je mets en dur dans les scripts un nom de fichier, cela fonctionne PARFAITEMENT. Je n'y comprends rien d'autant que sur un autre système cela marche.
Je suis sur 2008 et a priori cela fonctionne très bien en 2005.
Toute aide me sera précieuse.
Merci
Partager