SQLServerCentral Article

Handling Simple XML Using T-SQL

,

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)

Rate

5 (1)

You rated this post out of 5. Change rating

Share

Share

Rate

5 (1)

You rated this post out of 5. Change rating