Passar um objeto List<string> para uma SP SQL Server, usando XML e LINQ

Surgiu-me a necessidade de passar uma lista de valores variável para uma Stored Procedure de SQL Server. A opção que me pareceu mais adequada foi tirar partido do suporte a XML presente no SQL Server desde a versão 2000.


Primeiro que tudo é necessário passar o objeto List genérico para XML (C#):


List<string> l = new List<string>() { “a”, “b”, “c”, “d”, “e” };
XDocument xmlDocument =
new XDocument(
         
new XDeclaration(“1.0″, “UTF-8″, “yes”),
         
new XElement(
                
“Locations”,
                 l.Select(n =>
new XElement(
                         
“Location”
                          
new XAttribute(“id”, n)))));
string s = xmlDocument.ToString(SaveOptions.DisableFormatting);


 Dado que o XML produzido não se destina a ser humanamente lido, a flag “DisableFormatting” previne que seja adicionadas desnecessárias quebras de linha e indentação. Neste caso escolhi gerar um XL com atributos:


 

Do lado do SQL Server, podemos facilmente gerar uma tabela a partir do XML recebido, que poderemos utilizar como necessário (T-SQL):

DECLARE @x AS XML
SET @x=’<?xml version=”1.0″ encoding=”utf-8″?><Locations><Location id=”a”/><Location id=”b”/><Location id=”c”/><Location id=”d”/><Location id=”e”/></Locations>’

DECLARE @i int
EXEC sp_xml_preparedocument @i OUTPUT, @x;

SELECT location
FROM OPENXML(@i, ‘/Locations/Location’, 1)
WITH (location nvarchar(50) ‘@id’ )

EXEC sp_xml_removedocument @i

[2013-12-15] Removi a formatação no código T-SQL e corrigi o código apresentado


<?xml version=”1.0″ encoding=”utf-8″?><Locations><Location id=”a”/><Location id=”b”/><Location id=”c”/><Location id=”d”/><Location id=”e”/></Locations>

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>