Trabajando con Sql Server 2008 y XML

Desde la aparición de Sql Server 2005 y todas las funcionalidades para trabajar con XML, este se ha convertido en un recurso muy bueno en según que momentos del desarrollo de una aplicación. Poder guardar xml, sin tamaño fijo, estructurado y sobre el cual poder realizar búsquedas es un factor muy importante en el momento de decidir si trabajar con este tipo de datos.

En mi caso, lo utilizamos normalmente para tener una tabla desnormalizada, sobre el cual realizar una única lectura y obtener en una única lectura valores que obtendriamos en N lecturas debido a las relaciones 1 a N.

Ejemplo sencillo:

La complicación viene, cuando queremos efectuar diferentes operaciones sobre el xml, aquí van un par de ejemplos utiles:

XML Origen:

<ArrayOfVacancy_Benefits_Denormalized xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema>
  <
Vacancy_Benefits_Denormalized>
    <
IdVacancyBenefits>263716</IdVacancyBenefits>
    <
IdVacancy>1189680</IdVacancy>
    <
IdBenefits>16</IdBenefits>
    <
IdStatus>2</IdStatus>
    <
Benefits>Bônus por
resultado</Benefits>

  </
Vacancy_Benefits_Denormalized>
  <
Vacancy_Benefits_Denormalized>
    <
IdVacancyBenefits>263717</IdVacancyBenefits>
    <
IdVacancy>1189680</IdVacancy>
    <
IdBenefits>31</IdBenefits>
    <
IdStatus>2</IdStatus>
    <
Benefits>Vale-transporte</Benefits>
  </
Vacancy_Benefits_Denormalized>
</
ArrayOfVacancy_Benefits_Denormalized>

Consulta con where sobre el campo XML:

select Top 100 * from Vacancy where Benefits.exist(‘/ArrayOfVacancy_Benefits_Denormalized/Vacancy_Benefits_Denormalized[IdBenefits=16]’)=1

Como detalle, marcar que hay que igualar el resultado del exist a 1, ya que sino te indica que no es un resultado booleano (algo ilógico por su parte)

Select con subselect sobre el XML:

 

select cast(Benefits.query(‘for $i in
/ArrayOfVacancy_Benefits_Denormalized/Vacancy_Benefits_Denormalized//Benefits
return string($i)’
)as varchar(max))
from Vacancy


En este caso, como podemos tener N Vacancy_Benefits_Denormalized, concateno los Valores de Benefits y los devuelvo como una única columna.

3 comentarios en “Trabajando con Sql Server 2008 y XML”

  1. señor, esa serie de consultas sobre XML son lentas ??

    si se mete toda la información en campos xml y luego se pretende hacer una búsqueda de la información, XML no es menos óptimo que campos que no sean xml ?

    salu2

  2. Tal y como comentas, es menos optimo para realizar busquedas por este campo. Normalmente uso este tipo de diseños cuando no se hacen busquedas por este campo, o cuando se hacen son offline y no me importa un decremento del performance. Por contra, te evita realizar N lecturas en una tabla asociada, y por tanto, si no realizas busquedas pero si te interesa recuperar los valores en una única lectura es un diseño que te puede interesar.

  3. Plis ayuda con linq,
    var contactoLuis2 = (from c in bdmia.misdatos
    where c.data.Element(“Filial”).FirstAttribute.Value==”Filial1″
    select c);

    misdatos en una tabla que tienen un campo xml llamado data y tiene otro campo id que es un int,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *