DECLARE
@strXML NVARCHAR(4000)
,@XML XML
IF OBJECT_ID('tempdb..#Sub') IS NOT NULL
DROP TABLE #Sub
IF OBJECT_ID('tempdb..#Contact') IS NOT NULL
DROP TABLE #Contact
CREATE TABLE #Sub (
ID INT IDENTITY(1,1) NOT NULL,
SubID INT NOT NULL,
SubName NVARCHAR(50) NULL,
SubAddress NVARCHAR(50) NULL,
PRIMARY KEY (ID,SubID))
CREATE TABLE #Contact (
ID INT IDENTITY(1,1) NOT NULL,
SubID INT NOT NULL,
ContactAddress1 NVARCHAR(50) NULL,
ContactAddress2 NVARCHAR(50) NULL,
PRIMARY KEY (ID,SubID))
SET @strXML = '
<Sub>
<ID>1</ID>
<Name>Saran</Name>
<Address>123 Usa</Address>
<Contact>
<Address1>4534 China</Address1>
<Address2>7674 India</Address2>
</Contact>
</Sub>
<Sub>
<ID>2</ID>
<Name>Rajesh</Name>
<Address>456 India</Address>
<Contact>
<Address1>321 Japan</Address1>
<Address2>987 Korea</Address2>
</Contact>
</Sub>
'
BEGIN TRY
SELECT @XML = CONVERT(XML,@strXML)
INSERT INTO #Sub
SELECT
x.value('(ID)[1]','int') AS SubID
,x.value('(Name)[1]','varchar(30)') AS SubName
,x.value('(Address)[1]','varchar(30)') AS SubAddress
FROM @XML.nodes('/Sub') n(x)
INSERT INTO #Contact
SELECT
x.value('(ID)[1]','int') AS SubID
,x.value('(Contact/Address1)[1]','varchar(30)') AS ContactAddress1
,x.value('(Contact/Address2)[1]','varchar(30)') AS ContactAddress2
FROM @XML.nodes('/Sub') n(x)
SELECT
s.SubID
,s.SubName
,s.SubAddress
,c.ContactAddress1
,c.ContactAddress2
FROM
#Sub s
INNER JOIN
#Contact c
ON s.SubID = c.SubID
ORDER BY
s.SubID
END TRY
BEGIN CATCH
PRINT 'INVALID XML!'
END CATCH
Output
SubIDSubNameSubAddressContactAddress1ContactAddress2
1Saran123 Usa4534 China7674 India
2Rajesh456 India321 Japan987 Korea