IF OBJECT_ID('USP_IMPORT_XML_INTO_SQL', 'P') IS NOT NULL
DROP PROCEDURE DBO.USP_IMPORT_XML_INTO_SQL
GO
CREATE PROCEDURE DBO.USP_IMPORT_XML_INTO_SQL
(@P_STR_PATH VARCHAR(512),
@P_STR_FILENAME VARCHAR(56),
@P_STR_TABLENAME VARCHAR(32))
AS BEGIN
-------------------------------------------------------------------
-- Utilizzo : Legge un file @Path + @FileName (file/stream) --
-- XML ed importa i dati in @TableName --
-------------------------------------------------------------------
SET NOCOUNT ON
DECLARE @strCommand VARCHAR(1024)
IF(RIGHT(@P_STR_PATH, 1) <> '\')
SET @P_STR_PATH = @P_STR_PATH + '\'
-- Lettura file XML ed importazione dei dati all'interno di una tabella
-- temporanea
-- Creazione tabella temporanea
CREATE TABLE #tmpFileLines
(rowID INTEGER IDENTITY,
LineData VARCHAR(255))
-- Insert linea from files into temp table (utilizzo xp_cmdshell)
SET @strCommand = 'TYPE ' + @P_STR_PATH + @P_STR_FILENAME
INSERT #tmpFileLines EXEC master.dbo.xp_cmdshell @strCommand
DECLARE @strXMLText VARCHAR(8000),
@strCur_Line_XML VARCHAR(8000),
@strCur_Line_XML_Reverse VARCHAR(8000),
@str_Line_XML_To_Insert VARCHAR(8000),
@str_Line_XML_Res VARCHAR(8000),
@i INTEGER,
@j INTEGER,
@z INTEGER,
@hDoc INTEGER,
@str_TMP VARCHAR(512)
-- Lettura dei dati XML dalla tabella temporanea ad una variabile stringa
-- La variabile stringa verrà utilizzata con la OPENXML
DECLARE Cur_Read_Line_XML CURSOR
FOR SELECT ISNULL(RTRIM(LineData), '')
FROM #tmpFileLines ORDER BY rowID ASC
OPEN Cur_Read_Line_XML
FETCH NEXT FROM Cur_Read_Line_XML INTO @strCur_Line_XML
WHILE @@FETCH_STATUS = 0
BEGIN
SET @i = CHARINDEX('DATA IDENTIFIER="' + @P_STR_TABLENAME + '"',
@strCur_Line_XML)
IF (@i > 0)
BEGIN
SET @str_TMP = 'DATA IDENTIFIER="' + @P_STR_TABLENAME + '"'
SELECT @strCur_Line_XML = REPLACE(@strCur_Line_XML,
@str_TMP,
'DATA')
END
SET @strCur_Line_XML_Reverse = REVERSE(@strCur_Line_XML)
SET @j = CHARINDEX('>DROCER/<', @strCur_Line_XML_Reverse)
IF (@j = 0)
BEGIN
SET @str_Line_XML_Res = @strCur_Line_XML
FETCH NEXT FROM Cur_Read_Line_XML INTO @strCur_Line_XML
SET @strCur_Line_XML = @str_Line_XML_Res + @strCur_Line_XML
CONTINUE
END
--PRINT LEN(@strCur_Line_XML)
SET @z = (LEN(@strCur_Line_XML) - @j + 1)
SET @str_Line_XML_To_Insert = SUBSTRING(@strCur_Line_XML, 1, @z)
SET @str_Line_XML_Res = SUBSTRING(@strCur_Line_XML, @z+1, LEN(@strCur_Line_XML))
-- Preparazione documento per utilizzo della OPENXML
IF (CHARINDEX('</DATA>', UPPER(@str_Line_XML_To_Insert)) > 0)
EXEC sp_xml_preparedocument @hDoc OUTPUT, @str_Line_XML_To_Insert
ELSE BEGIN
SET @str_Line_XML_To_Insert = @str_Line_XML_To_Insert + '</DATA>'
EXEC sp_xml_preparedocument @hDoc OUTPUT, @str_Line_XML_To_Insert
END
-- Inserimento utilizzando OPENXML
--PRINT (@str_Line_XML_To_Insert)
-- Import Tabella1 (esempio)
IF (UPPER(@P_STR_TABLENAME)=UPPER('Tabella1'))
INSERT INTO Tabella1
SELECT *
FROM OPENXML(@hDOC, '/DATA/RECORD', 2)
WITH Tabella1
-- Import Tabella2 (esempio)
ELSE IF (UPPER(@P_STR_TABLENAME)=UPPER('Tabella2'))
INSERT INTO Tabella2
SELECT *
FROM OPENXML(@hDOC, '/DATA/RECORD', 2)
WITH Tabella2
--ELSE... Import Tabella3 (esempio)
ELSE
PRINT 'L''Import della tabella ' + @P_STR_TABLENAME + ' non è gestito.'
EXEC sp_xml_removedocument @hdoc
FETCH NEXT FROM Cur_Read_Line_XML INTO @strCur_Line_XML
SET @strCur_Line_XML = '<DATA>' + @str_Line_XML_Res + @strCur_Line_XML
END
CLOSE Cur_Read_Line_XML
DEALLOCATE Cur_Read_Line_XML
DROP TABLE #tmpFileLines
SET NOCOUNT OFF
END