Learn more about SQL Server tools

mssqltips logo

Tutorials          DBA          Dev          BI          Career          Categories          Webcasts          Whitepapers          Today's Tip          Join

Tutorials      DBA      Dev      BI      Categories      Webcasts

DBA    Dev    BI    Categories


Simple way to Import XML Data into SQL Server with T-SQL

By:   |   Last Updated: 2018-10-10   |   Comments (3)   |   Related Tips: More > XML


XML is a data format used to share data in a form that can be easily used and shared. There is often the need import XML files into SQL Server which can be done several ways and in this tip we will look at a simple way to do this using just T-SQL commands.


There many possible ways to perform this type of import and in this tip we will show how this can be done using T-SQL and OPENROWSET to read the XML data and load into a SQL Server table.  In order for you to understand it better, let’s walk through an example.

Step 1 – Create table to store imported data

Let’s create a simple table thatíll store the data of our customers.

USE mssqltips_db

    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DOCUMENT] [varchar](20) NOT NULL,
    [NAME] [varchar](50) NOT NULL,
    [ADDRESS] [varchar](50) NOT NULL,
    [PROFESSION] [varchar](50) NOT NULL,

Step 2 - Create Sample XML File

Below is sample XML data.  You can use this as is or modify for your own tests. I copied this data and stored in a file named MSSQLTIPS_XML.xml.

<?xml version="1.0" encoding="utf-8"?>
    <Document>000 000 000</Document>
    <Name>Mary Angel</Name>
    <Address>Your City, YC 1212</Address>
    <Profession>Systems Analyst</Profession>
    <Document>000 000 001</Document>
    <Name>John Lenon</Name>
    <Address>Your City, YC 1212</Address>
    <Document>000 000 002</Document>
    <Name>Alice Freeman</Name>
    <Address>Your City, YC 1212</Address>
    <Document>000 000 003</Document>
    <Name>George Sands</Name>
    <Address>Your City, YC 1212</Address>
    <Document>000 000 004</Document>
    <Name>Mark Oliver</Name>
    <Address>Your City, YC 1212</Address>

Step 3 – Importing the XML data file into a SQL Server Table

Now all we need is to make SQL Server read the XML file and import the data via the OPENROWSET function. This function is native to T-SQL and allows us to read data from many different file types through the BULK import feature, which allows the import from lots of file types, like XML.

Here is the code to read the XML file and to INSERT the data into a table.

   MY_XML.Customer.query('Document').value('.', 'VARCHAR(20)'),
   MY_XML.Customer.query('Name').value('.', 'VARCHAR(50)'),
   MY_XML.Customer.query('Address').value('.', 'VARCHAR(50)'),
   MY_XML.Customer.query('Profession').value('.', 'VARCHAR(50)')
      CROSS APPLY MY_XML.nodes('Customers/Customer') AS MY_XML (Customer);
  • The first thing we are doing is a simple INSERT into our table CUSTOMERS_TABLE.
  • The columns in the SELECT are pulled from the alias we created named MY_XML and we are querying each element of the Customer node.
  • The FROM clause is derived by using the OPENROWSET operation using the BULK option and the SINGLE_BLOB option to have the data returned from the XML file into a single column and row. The function nodes() along with CROSS APPLY allows navigation through the XML element’s in order to get all of Customer objects properly encapsulated.

Step 4 - Check the Imported XML Data

After the insert, you can query the table to check the results:

xml file import query results
Next Steps

Last Updated: 2018-10-10

next webcast button

next tip button

About the author
MSSQLTips author Diogo Souza Diogo Souza has been passionate about clean code, data manipulation, software design and development for almost ten years.

View all my tips

Post a comment or let the author know this tip helped.

All comments are reviewed, so stay on subject or we may delete your comment. Note: your email address is not published. Required fields are marked with an asterisk (*).

*Name    *Email    Email me updates 

Signup for our newsletter
 I agree by submitting my data to receive communications, account updates and/or special offers about SQL Server from MSSQLTips and/or its Sponsors. I have read the privacy statement and understand I may unsubscribe at any time.


Tuesday, January 08, 2019 - 11:07:44 AM - Tom Back To Top

†If the XML file contains a reference to a DTD file, you will need to change the CAST to a CONVERT to avoid the "Cannot parse..." error.† As:


Thursday, October 11, 2018 - 10:23:46 AM - Eirikur Eiriksson Back To Top

Mikael Eriksson beat me to it!

The text() function prevents the result set from being constructed as an XML, removes at least two blocking operators from the execution plan.

Wednesday, October 10, 2018 - 2:30:07 AM - Mikael Eriksson Back To Top


There are some issues with your code that makes it go really slow. Specificcly the cast to XML and the use of the query() function.†

Add a couple of hundred Customer nodes to your XML and compare duration between your version and†a rewritten version below.†

On my machine for 300 Customer elements, duration goes from 8 seconds down to 18 millisecond.

declare @X xml;
select @X = T.MY_XML
from openrowset(bulk 'D:\slask\MSSQLTIPS_XML.xml', single_blob) as T(MY_XML)
† †MY_XML.Customer.value('(Document/text())[1]', 'VARCHAR(20)'),
† †MY_XML.Customer.value('(Name/text())[1]', 'VARCHAR(50)'),
† †MY_XML.Customer.value('(Address/text())[1]', 'VARCHAR(50)'),
† †MY_XML.Customer.value('(Profession/text())[1]', 'VARCHAR(50)')
from @X.nodes('Customers/Customer') AS MY_XML (Customer);

Learn more about SQL Server tools