Using xml data type as input parameter of stored procedure, you can store XML documents and fragments in a SQL Server database
Suppose we have XML file as show below:
Inside First Node Inside Second Node 1 inside Second Node 2 - Item 1
- Item 2
- Item 3
We can store above XML file using C# code snippet by passing XML file in a stored procedure as shown below
static void Main(string[] args)
{
string SProc = "dbo.usp_XMLParser";
string ConnectonString = @"Data Source=JITENDRAPAL\SQLEXPRESS;Initial Catalog=JPDB;Integrated Security=True;";
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"my.xml");
using (SqlConnection sqlConnection = new SqlConnection(ConnectonString))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand(SProc, sqlConnection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.Add(
new SqlParameter("@XMLFile", SqlDbType.Xml)
{
Value = new SqlXml(new XmlTextReader(xmldoc.InnerXml, XmlNodeType.Document, null))
});
using (DataTable dataTable = new DataTable())
{
dataTable.Locale = CultureInfo.InvariantCulture;
using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter())
{
sqlDataAdapter.SelectCommand = sqlCommand;
sqlDataAdapter.Fill(dataTable);
}
Console.WriteLine(dataTable.Rows[0]["Col1"].ToString());
Console.Read();
}
}
}
Console.Read();
}
In above
code:
a.
My.xml is xml file as shown in point
1
b.
We can load xml file using
XMLDocument Load method as shown below
XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(@"my.xml");
c.
Pass xml file using SQLParameter to
the stored procedure as shown below
sqlCommand.Parameters.Add(
new SqlParameter("@XMLFile", SqlDbType.Xml)
{
Value = new SqlXml(new XmlTextReader(xmldoc.InnerXml, XmlNodeType.Document, null))
});
Stored procedure ‘usp_XMLParser’ takes XML file as input and store XML file in SQL table
SQL Script of stored procedure is as shown below:
USE [JPDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_XMLParser] @XMLFile XML
AS
BEGIN
DECLARE @hdoc [int]
DECLARE @ID [int]
DECLARE @Key [varchar](1000)
DECLARE @NumberOfKeys [int]
DECLARE @Counter [int] = 0;
DECLARE @Value [varchar](2000);
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[XMLDataTable]') AND TYPE IN (N'U'))
BEGIN
DROP TABLE [dbo].[XMLDataTable]
END
-- Creating table
CREATE TABLE [dbo].[XMLDataTable](
[ID] [int]
,[Key] [varchar](1000)
,[Value] [varchar](2000)
)
SET @NumberOfKeys= (SELECT COUNT([Key]) FROM [JPDB].[dbo].[XMLKeysTable]);
EXEC sp_xml_preparedocument @hdoc OUTPUT, @XMLFile
WHILE(@Counter < @NumberOfKeys)
BEGIN
SELECT @ID= [ID], @Key = [Key] FROM [JPDB].[dbo].[XMLKeysTable] ORDER BY [Key] OFFSET @Counter ROWS FETCH NEXT 1 ROWS ONLY
SELECT @Value = Value FROM OPENXML (@hdoc, @Key,1) WITH (Value [varchar](1000) 'text()[1]')
INSERT INTO [dbo].[XMLDataTable]
VALUES(@ID, @Key, @Value)
SET @Counter += 1;
END
--Removes the internal representation of the XML document specified by the document handle and invalidates the document handle
EXEC sp_xml_removedocument @hdoc
SELECT 'true' AS [Col1]
END
·
Above stored procedure takes XML
file as input using XML type input parameter
@XMLFile XML
I am storing XML file in table ‘dbo.XMLDataTable’
To know more about XML parsing in T-SQL and explanation of above stored procedure refer my next post ‘XML Parser in SQL Server’
Thanks...it helps.
ReplyDeleteI owe you one man...
ReplyDeleteIt worked for me. thanks :)
ReplyDelete