Solved

Bulk sql upload of XML

Posted on 2010-11-22
11
632 Views
Last Modified: 2013-01-25
hello experts,

I would like to transfer xml values to SQL server 2008 I am unsure on how to do so. the XML schema is below

<Orders>
  <OrderItems Product_ID="26" ProductName="" ProductDesc="Geospatial Experts" ProductPrice="" />
  <OrderItems Product_ID="2" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcMap" ProductPrice="" />
  <OrderItems Product_ID="7" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcCatalog" ProductPrice="" />
  <OrderItems Product_ID="8" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcToolbox (ArcMap)" ProductPrice="" />
  <OrderItems Product_ID="10" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcToolbox (ArcCatalog)" ProductPrice="" />
  <OrderItems Product_ID="11" ProductName="" ProductDesc="ESRI ArcGIS 9.3 Desktop Administrator" ProductPrice="" />
  <OrderItems Product_ID="17" ProductName="" ProductDesc="Quantum GIS" ProductPrice="" />
  <OrderItems Product_ID="22" ProductName="" ProductDesc="Microsoft Office 2010" ProductPrice="" />
  <OrderItems Product_ID="23" ProductName="" ProductDesc="Microsoft Windows Server 2008 R2" ProductPrice="" />
</Orders>

Open in new window

0
Comment
Question by:XGIS
  • 5
  • 3
  • 2
  • +1
11 Comments
 
LVL 3

Expert Comment

by:kraiven
ID: 34187930
Either convert to a DataTable, or pass through a DataReader.

Instantiate a SqlBulkCopy object

Call WriteToServer on the instance passing it your DataTable or your Reader.

Note: Column names will have to match, but you can manipulate this if they don't already.
0
 
LVL 7

Author Comment

by:XGIS
ID: 34189441
Hello Kraiven:

Would you have a working example of this and will the node attributes impact the process?
0
 
LVL 1

Accepted Solution

by:
TDangler earned 250 total points
ID: 34189474
Or if you want to do it directly with SQL, try something like this,

(Assuming you have a table Orders(Product_ID int, ProductName varchar(32),  ProductDesc varchar(max), ProductPrice money)

you can go something the attached code...
 
declare @myXml xml = '
<Orders>
  <OrderItems Product_ID="26" ProductName="" ProductDesc="Geospatial Experts" ProductPrice="" />
  <OrderItems Product_ID="2" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcMap" ProductPrice="" />
  <OrderItems Product_ID="7" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcCatalog" ProductPrice="" />
  <OrderItems Product_ID="8" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcToolbox (ArcMap)" ProductPrice="" />
  <OrderItems Product_ID="10" ProductName="" ProductDesc="ESRI ArcGIS 9.3 ArcToolbox (ArcCatalog)" ProductPrice="" />
  <OrderItems Product_ID="11" ProductName="" ProductDesc="ESRI ArcGIS 9.3 Desktop Administrator" ProductPrice="" />
  <OrderItems Product_ID="17" ProductName="" ProductDesc="Quantum GIS" ProductPrice="" />
  <OrderItems Product_ID="22" ProductName="" ProductDesc="Microsoft Office 2010" ProductPrice="" />
  <OrderItems Product_ID="23" ProductName="" ProductDesc="Microsoft Windows Server 2008 R2" ProductPrice="" />
</Orders>'


Insert into Orders
	 select c.value('@Product_ID', 'int'), c.value('@ProductName','varchar(32)'), c.value('@ProductDesc','varchar(max)'), c.value('@ProductPrice','money')
       from @myXml.nodes('/Orders/OrderItems') T(c)

Open in new window

0
 
LVL 7

Author Comment

by:XGIS
ID: 34189668
Hello TDangler:

so you are suggestion to do a regular insert statement and use the xml as the source?? I am not sure where declare is supposed to be as I have never used it in C# only sql stored procedures. and it will need to load a file rather than be hard coded.
0
 
LVL 1

Assisted Solution

by:TDangler
TDangler earned 250 total points
ID: 34189716
Hi XGIS,

I'm just suggesting you simply run that code I posted directly in SQL Management Studio (Or whateer your SQL Client software is)..

That is if this is something you only have to do once.

If you have to do it regularly, I would suggest using kraiven's solution, or createing a Sproc that does the above Xml-parse and insert...  
create procedure Save_Xml
@myXml	xml
as 

begin

Insert into Orders
	 select c.value('@Product_ID', 'int'), c.value('@ProductName','varchar(32)'), c.value('@ProductDesc','varchar(max)'), c.value('@ProductPrice','money')
       from @myXml.nodes('/Orders/OrderItems') T(c)
       
end

Open in new window


Then you can pass your Xml as a string SqlParameter to a SqlCommand..

And so on...
0
Get up to 2TB FREE CLOUD per backup license!

An exclusive Black Friday offer just for Expert Exchange audience! Buy any of our top-rated backup solutions & get up to 2TB free cloud per system! Perform local & cloud backup in the same step, and restore instantly—anytime, anywhere. Grab this deal now before it disappears!

 
LVL 3

Expert Comment

by:kraiven
ID: 34189859
Hi XGIS,

Sorry I did make the - probably unreasonable - assumption that you were running the insert from .Net code. TDangler's solution is good, but it is not a bulk insert; if your XML is many ten's of thousands of rows you might well experience performance issues. Look at the MSDN page for BULK INSERT from XML for an example of Bulk inserting from XML data.
If you are interested in doing the bulk insert from .Net then let me know and I can post some sample code probably tomorrow.
0
 
LVL 7

Author Comment

by:XGIS
ID: 34190063
Hello Kraiven:

yes I intend to run it via .net code C#, in a web app, the xml is stored on the clients pc within a cookie and when a button is clicked the xml in the coockie needs to be saved in a SQL database where the table has the schema as the xml.. I am thinking that maybe the datatable option is a good one... or even read directly from the cookie via
 HttpCookie customerXmlDataCookie= Request.Cookies["CustomerXmlData"];
            if( customerXmlDataCookie != null )
            {
                        // put your logic here
            }

Open in new window

0
 
LVL 3

Expert Comment

by:kraiven
ID: 34190175
OK, as I said I'll put together a short example tomorrow. In the meantime, if you're not familiar already, take a look at DataReaders and the System.Data.SqlBulkCopy class.
0
 
LVL 7

Author Comment

by:XGIS
ID: 34190370
No problem sounds wonderful thanks, I am rather familiar with sqlbulkcopy class as I used it a couple of years ago to transfer uploaded geodatabases to sql, the only thing i am concerned about is the node attributes on my current xml file
0
 
LVL 1

Expert Comment

by:pankajgharge
ID: 34202600
In CSharp, create a DataSet from XML and the upload the dataset by using SqlBulkCopy class to SQL server....
else
solution provided by TDangler looks great if you want to use Managemant Studio.
0
 
LVL 7

Author Closing Comment

by:XGIS
ID: 34329271
I ended up scraping the xml thing as sql session was better than xml and since there was no xml this question became redundant, sorry guys and thanks for your valuable time and input
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.
This video explains how to create simple products associated to Magento configurable product and offers fast way of their generation with Store Manager for Magento tool.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now