Buscar este blog

lunes, 4 de marzo de 2013

Pasar XML a stored procedure en SQLServer 2005 o superior

Hola, hace tiempo vimos como pasar un XML a un sp en SQL2005, hoy les traigo una forma mas eficiente de pasar un xml por parámetro que funciona en 2005 o superior.

La diferencia principal radica que ahora si mandamos un tipo de datos XML propio del manejador de base de datos.
Ejemplo:


CREATE PROC spPrueba
@sXML XML
AS
BEGIN 
-- Logica
END


Si mal no recuerdo el tipo de dato XML esta disponible a partir de la version 2005 de SQLServer y por lo tanto pueden aplicar la lectura de ese xml de la siguiente forma:



SELECT t.value('./@Clave','INT'),
t.value('./@Descripcion','VARCHAR(30)')
FROM @sXML.nodes('//row') x(t)


Donde @sXML es nuestro parametro, y "row" es nuestro nodo de cada elemento de nuestro xml, y por medio de "t" y la funcion "value" obtenemos nuestro valor de cada propiedad de nuestro nodo.

Les dejo aquí un ejemplo completo:


CREATE PROC spPrueba
@sXML XML
AS
BEGIN 
SELECT t.value('./@Clave','INT'),
t.value('./@Descripcion','VARCHAR(30)')
FROM @sXML.nodes('//row') x(t) 
END

go

--Ejecuto sp
EXEC dbo.spPrueba @sXML = '<row Clave="1" Descripcion="Dato 1" />
<row Clave="2" Descripcion="Dato 2" />' -- xml

go

DROP PROC spPrueba

De igual manera como lo hicimos en el ejemplo pasado podrian ejecutar un insert select para guardar directo en su tabla o en unta tabla temporal para procesar la información.

Espero que les sea de utilidad....
---------------------------------------
Lo que se puede imaginar... se puede programar

Nota: Articulo anterior: http://ganda-csharp.blogspot.mx/2012/07/pasar-un-xml-por-parametro-un-stored.html



2 comentarios:

  1. Interesante artículo, quisiera su opinión sobre cuales son los escenarios donde no se debe usar XML como parámetro de un SP.

    ResponderEliminar
    Respuestas
    1. Hola, pues todo depende de lo que necesites hacer, mas que nada utilizarías el paso de un xml cuando necesites enviar un set de información, por ejemplo:
      si tienes un grid donde vas agregando renglones y hasta el final guardas esa info, ahí seria bueno y mas facil enviar todos los registros a un sp y así evitarías la llamada de n veces al sp de guardar(sin hace un ciclo en el front end).
      Y en que escenarios no debes utilizarlo?, pues simplemente cuando no necesites enviar un conjunto de información(un sólo registro).
      Este tipo de parámetro también lo he utilizado cuando necesito enviar claves que vengan de una lista multiseleccion, ahí también te serviría mucho en lugar de mandar un string con las claves separadas por coma.

      Eliminar