PATH Mode with FOR XML

PATH Mode with FOR XML

Hello friends, We have already explain regarding IIF() in SQL Server,Right Join in SQL Server,left join in SQLSelf Join in SQL Server , RANK(),  DENSE_RANK()ROW_NUMBER() and  Aggregate functions in sql server. Today I am going to explain regarding Create XML in SQL Server, however this is my first step toward writing post.  I will also explain “How to create XML by using PATH Mode with FOR XML in SQL Server”.

PATH Mode with FOR XML
PATH Mode with FOR XML

There are four modes supported by FOR XML clause:

  1. RAW

  2. AUTO

  3. EXPLICIT

  4. PATH

In this article I will explain regarding PATH mode with for xml clause.

When you specify the PATH mode in the FOR XML clause, column names (or their aliases) are treated as XPath expressions that determine how the data values will be mapped to the XML result set. By default, XML elements are defined based on column names. You can modify the default behavior by using the at (@) symbol to define attributes or the forward slash (/) to define the hierarchy. Let’s take a look at a few examples to demonstrate how all this works.

We’ll begin with the PATH mode’s default behavior. The following example includes a FOR XML clause that specifies only the PATH option:

Creating a table variable and inserting some records into it.

DECLARE @tmpAgency AS TABLE (
	agency_id INT
	,agency_name VARCHAR(50)
	,agency_code VARCHAR(50)
	)

INSERT INTO @tmpAgency (
	agency_id
	,agency_name
	,agency_code
	)
SELECT 1 ,'A and k Fowler Insurance Agency' ,'AG1011'           UNION ALL
SELECT 2 ,'Doherty Ins Agency Inc.','AGT10001'                  UNION ALL
SELECT 3 ,'Doherty-White Insurance Agency,Inc.','AGT10012'      UNION ALL
SELECT 4 ,'John F. Dolan AGT10034' ,'AGT10034'                  UNION ALL
SELECT 5 ,'P.S. Dolan InsuranceUSE AGT 59771' ,'AGT10045'

SELECT * FROM @tmpAgency AgencyInfo

OUTPUT:

For-XML-sample-Table
For-XML-sample-Table
SELECT *
FROM @tmpAgency
FOR XML PATH('Retailer')
	,TYPE

OUTPUT:

<Retailer>
  <agency_id>1</agency_id>
  <agency_name>A and k Fowler Insurance Agency</agency_name>
  <agency_code>AG1011</agency_code>
</Retailer>
<Retailer>
  <agency_id>2</agency_id>
  <agency_name>Doherty Ins Agency Inc.</agency_name>
  <agency_code>AGT10001</agency_code>
</Retailer>
<Retailer>
  <agency_id>3</agency_id>
  <agency_name>Doherty-White Insurance Agency,Inc.</agency_name>
  <agency_code>AGT10012</agency_code>
</Retailer>
<Retailer>
  <agency_id>4</agency_id>
  <agency_name>John F. Dolan AGT10034</agency_name>
  <agency_code>AGT10034</agency_code>
</Retailer>
<Retailer>
  <agency_id>5</agency_id>
  <agency_name>P.S. Dolan InsuranceUSE AGT 59771</agency_name>
  <agency_code>AGT10045</agency_code>
</Retailer>

You can also assign Namespaces and schema instance by using XMLNAMESPACES Clause.

;WITH XMLNAMESPACES (
	'http://www.w3.org/2001/XMLSchema-instance' AS xsi
	,'http://www.abc.com/Retailer' AS p1
	) SELECT agency_name
AS 'Agency_Name'
	,agency_id 'Agency_Id'
	,agency_code 'Agency_Code' FROM @tmpAgency FOR XML PATH ('p1:Retailer')
	,TYPE

OUTPUT:

<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Agency_Name>A and k Fowler Insurance Agency</Agency_Name>
  <Agency_Id>1</Agency_Id>
  <Agency_Code>AG1011</Agency_Code>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Agency_Name>Doherty Ins Agency Inc.</Agency_Name>
  <Agency_Id>2</Agency_Id>
  <Agency_Code>AGT10001</Agency_Code>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Agency_Name>Doherty-White Insurance Agency,Inc.</Agency_Name>
  <Agency_Id>3</Agency_Id>
  <Agency_Code>AGT10012</Agency_Code>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Agency_Name>John F. Dolan AGT10034</Agency_Name>
  <Agency_Id>4</Agency_Id>
  <Agency_Code>AGT10034</Agency_Code>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Agency_Name>P.S. Dolan InsuranceUSE AGT 59771</Agency_Name>
  <Agency_Id>5</Agency_Id>
  <Agency_Code>AGT10045</Agency_Code>
</p1:Retailer>

XML using namespace and tags with attributes

;WITH XMLNAMESPACES (
	'http://www.w3.org/2001/XMLSchema-instance' AS xsi
	,'http://www.abc.com/Retailer' AS p1
	)
SELECT agency_name AS 'AgencyInfo/@Agency_Name'
	,agency_id 'AgencyInfo/Agency_Id'
	,agency_code 'AgencyInfo/Agency_Code'
	FROM @tmpAgency
FOR XML PATH ('p1:Retailer'),TYPE

OUTPUT:

<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <AgencyInfo Agency_Name="A and k Fowler Insurance Agency">
    <Agency_Id>1</Agency_Id>
    <Agency_Code>AG1011</Agency_Code>
  </AgencyInfo>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <AgencyInfo Agency_Name="Doherty Ins Agency Inc.">
    <Agency_Id>2</Agency_Id>
    <Agency_Code>AGT10001</Agency_Code>
  </AgencyInfo>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <AgencyInfo Agency_Name="Doherty-White Insurance Agency,Inc.">
    <Agency_Id>3</Agency_Id>
    <Agency_Code>AGT10012</Agency_Code>
  </AgencyInfo>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <AgencyInfo Agency_Name="John F. Dolan AGT10034">
    <Agency_Id>4</Agency_Id>
    <Agency_Code>AGT10034</Agency_Code>
  </AgencyInfo>
</p1:Retailer>
<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <AgencyInfo Agency_Name="P.S. Dolan InsuranceUSE AGT 59771">
    <Agency_Id>5</Agency_Id>
    <Agency_Code>AGT10045</Agency_Code>
  </AgencyInfo>
</p1:Retailer>

XML using namespace and tags with attributes including in One Root Element

;WITH XMLNAMESPACES (
	'http://www.w3.org/2001/XMLSchema-instance' AS xsi
	,'http://www.abc.com/Retailer' AS p1
	)
SELECT agency_name AS 'p1:AgencyInfo/Agency_Name'
	,agency_id 'p1:AgencyInfo/Agency_Id'
	,agency_code 'p1:AgencyInfo/Agency_Code' FROM @tmpAgency FOR XML PATH ('')
	,type
	,root ('p1:Retailer')

OUTPUT:

<p1:Retailer xmlns:p1="http://www.abc.com/Retailer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <p1:AgencyInfo>
    <Agency_Name>A and k Fowler Insurance Agency</Agency_Name>
    <Agency_Id>1</Agency_Id>
    <Agency_Code>AG1011</Agency_Code>
  </p1:AgencyInfo>
  <p1:AgencyInfo>
    <Agency_Name>Doherty Ins Agency Inc.</Agency_Name>
    <Agency_Id>2</Agency_Id>
    <Agency_Code>AGT10001</Agency_Code>
  </p1:AgencyInfo>
  <p1:AgencyInfo>
    <Agency_Name>Doherty-White Insurance Agency,Inc.</Agency_Name>
    <Agency_Id>3</Agency_Id>
    <Agency_Code>AGT10012</Agency_Code>
  </p1:AgencyInfo>
  <p1:AgencyInfo>
    <Agency_Name>John F. Dolan AGT10034</Agency_Name>
    <Agency_Id>4</Agency_Id>
    <Agency_Code>AGT10034</Agency_Code>
  </p1:AgencyInfo>
  <p1:AgencyInfo>
    <Agency_Name>P.S. Dolan InsuranceUSE AGT 59771</Agency_Name>
    <Agency_Id>5</Agency_Id>
    <Agency_Code>AGT10045</Agency_Code>
  </p1:AgencyInfo>
</p1:Retailer>

As these preceding examples demonstrate, the PATH Mode with FOR XML provides a relatively easy way to define elements and attributes in your XML result set.

If you have any questions for whatever I have explained here then feel free to comment.

 

Leave a Reply