This article describes how to traverse a simple XML file that has only 2 attributes (name and value, like a dictionary). And get the results in a single column in SQL SERVER result set
When dealing with interfaces to other applications that are not SQL SERVER based or even not even RDBMS based, the best (and simplest) media for communicating is the XML file.
When the data required can be arranged in a dictionary manner (name and value), the remote application can make an XML file in the following form at :
<ROOT>
<LINE>
<NAME>NAME1</NAME>
<VALUE>VALUE1</VALUE>
</LINE>
<LINE>
<NAME>NAME2</NAME>
<VALUE>VALUE2</VALUE>
</LINE>
.
.
.
.
.
</ROOT>
I wrote a procedure that gets the XML file full path and name and traverses the XML file and the output is a single column result set where the odd rows are the "name" tags value and the even rows are the "value" tags value.
I used the BULK INSERT t-sql Statement combined with dynamic sql execution in order to "bulk copy" the XML file Inside SQL Server. This is the code implementation of the XML traversing process :
create proc sp_translate_simple_xml
(@XMLfile varchar(100))
as
begin
declare @idoc int
declare @doc varchar(8000)
declare @xml_line varchar(200)
declare @bulkinscmd varchar(500)
set @doc =''
-- insert XML file into temporary table
Create table #tempXML
(line varchar(8000))
set @bulkinscmd = 'BULK INSERT #tempXML FROM ' +
'''' + @XMLfile + ''''
exec (@bulkinscmd)
DECLARE xml_cursor CURSOR
FOR SELECT * FROM #tempXML
-- create XML string in SQL SERVER memory
OPEN xml_cursor
FETCH NEXT FROM xml_cursor INTO @xml_line
WHILE @@FETCH_STATUS = 0
BEGIN
SET @doc = @doc + rtrim(ltrim(@xml_line))
FETCH NEXT FROM xml_cursor INTO @xml_line
END
close xml_cursor
deallocate xml_cursor
drop table #tempXML
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT statement using OPENXML rowset provider
SELECT text
FROM OPENXML (@idoc, '/ROOT/LINE')
WHERE text is not null
EXEC sp_xml_removedocument @idoc
END
Go
Example of a call to the procedure. Suppose an XML called dict.xml is
in C:\sql. That looks like this:
<ROOT>
<LINE>
<NAME>SUBJECT</NAME>
<VALUE>ELI SECTION</VALUE>
</LINE>
<LINE>
<NAME>THE PLANT</NAME>
<VALUE>IEC factory</VALUE>
</LINE>
<LINE>
<NAME>CREATE DATE</NAME>
<VALUE>01/07/2004</VALUE>
</LINE>
</ROOT>
after running the procedure :
use master
go
exec sp_translate_simple_xml 'c:\sql\dict.xml'
this will traverse the dict.xml file and produce a single column result set with name in odd row numbers and values in even row numbers. We will get the following results (using this file - dict.xml):
text
--------------------------
SUBJECT
ELI SECTION
THE PLANT
IEC factory
CREATE DATE
01/07/2004
(6 row(s) affected)
Conclusion
The procedure can be used as an ideal tool for communicating with applications that cannot link directly to SQL server , must use an intermediate media and a little amount of data is required for communication.
Eli Leiba works at Israel Electric Company as a Senior Application DBA in Oracle and MS SQL
Server. He also has certifications from Microsoft and BrainBench in Oracle and SQL Server database administration and implementation. Mr. Leiba holds a B.S. in Computer Science since 1991 and has 13 years' experience working in the databases field. Additionally Mr. Leiba teaches SQL Server DBA and Development courses at Microsoft CTEC and also serves as a senior database consultant for several Israeli start-up companies. (e-mail: iecdba@hotmail.com)