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
Ejemplos sobre lenguajes de programación como C#, VB.Net, Java(android), JavaScript, VB6, AJAX, SQLServer, Oracle...
Buscar este blog
Mostrando entradas con la etiqueta Parámetro XML. Mostrar todas las entradas
Mostrando entradas con la etiqueta Parámetro XML. Mostrar todas las entradas
lunes, 4 de marzo de 2013
viernes, 6 de julio de 2012
Pasar un XML por parámetro a un Stored Procedure en SQLServer 2005
Hola, hoy les traigo algo muy interesante y que me a ayudado mucho a la hora de guardar un conjunto de información que traigo en memoria dentro de mi aplicación. Con esto podran guardar toda su información en una sola llamada al sp, sin necesidad de hacer un ciclo y mandar a llamar el sp n veces por cada registro a insertar.
Ejemplo:
CREATE PROC spTestXML
@psXML NVARCHAR(max)
AS
BEGIN
SET NOCOUNT ON
DECLARE @nIdXml INT
DECLARE @tblRegistros TABLE (Indice INT IDENTITY(1,1), ClaEmpleado INT, Nombre VARCHAR(100))
IF ISNULL(@psXML,'') <> ''
BEGIN
exec dbo.sp_xml_preparedocument @nIdXml OUTPUT, @psXML
INSERT INTO @tblRegistros (ClaEmpleado, Nombre)
SELECT ClaEmpleado, Nombre
FROM OPENXML (@nIdXml, '/Empleados/Empleado', 3)
WITH (ClaEmpleado INT, Nombre VARCHAR(100))
EXEC dbo.sp_xml_removedocument @nIdXml
END
SELECT * FROM @tblRegistros
SET NOCOUNT OFF
END
@psXML NVARCHAR(max)
AS
BEGIN
SET NOCOUNT ON
DECLARE @nIdXml INT
DECLARE @tblRegistros TABLE (Indice INT IDENTITY(1,1), ClaEmpleado INT, Nombre VARCHAR(100))
IF ISNULL(@psXML,'') <> ''
BEGIN
exec dbo.sp_xml_preparedocument @nIdXml OUTPUT, @psXML
INSERT INTO @tblRegistros (ClaEmpleado, Nombre)
SELECT ClaEmpleado, Nombre
FROM OPENXML (@nIdXml, '/Empleados/Empleado', 3)
WITH (ClaEmpleado INT, Nombre VARCHAR(100))
EXEC dbo.sp_xml_removedocument @nIdXml
END
SELECT * FROM @tblRegistros
SET NOCOUNT OFF
END
Ejecución:
EXEC spTestXML @psXML = '<Empleados>
<Empleado>
<ClaEmpleado>2001</ClaEmpleado>
<Nombre>Hugo</Nombre>
</Empleado>
<Empleado>
<ClaEmpleado>5214</ClaEmpleado>
<Nombre>Paco</Nombre>
</Empleado>
<Empleado>
<ClaEmpleado>7841</ClaEmpleado>
<Nombre>Luis</Nombre>
</Empleado>
</Empleados>'
<Empleado>
<ClaEmpleado>2001</ClaEmpleado>
<Nombre>Hugo</Nombre>
</Empleado>
<Empleado>
<ClaEmpleado>5214</ClaEmpleado>
<Nombre>Paco</Nombre>
</Empleado>
<Empleado>
<ClaEmpleado>7841</ClaEmpleado>
<Nombre>Luis</Nombre>
</Empleado>
</Empleados>'
Puntos importantes:
- El parámetro del sp sera de tipo VARCHAR o NVARCHAR
- Hay que ejecutar el sp " sp_xml_preparedocument " el cual te devuelve un ID (sobre este valor se trabaja para obtener los datos)
- La función "OPENXML" y "WITH" nos ayudaran a obtener nuestros datos, digamos que nos convierte el xml a una tabla. Esta función recibe como parámetro el ID antes obtenido y un string especificándole la estructura de nuestro xml. En la función WITH se especifican los atributos que va a contener los valores del xml, digamos que aquí especificamos el nombre y tipo de dato que recibirá los valores que contiene nuestro xml.
- " sp_xml_removedocument ", al final sólo removemos nuestro xml cargado en memoria con ayuda del ID generado con el primer sp.
Como pueden ver el manejo de xml en SQLServer es muy facil y nos puede ayudar en performance, para evitar ciclos inicesarios, si lo que queremos es insertar un conjunto de registro, en lugar de insertar uno por uno sólo sera necesario un INSERT SELECT.
Actualización (chequen esta forma que es mas sencilla de utilizar):
http://ganda-csharp.blogspot.mx/2013/03/pasar-xml-stored-procedure-en-sqlserver.html
Actualización (chequen esta forma que es mas sencilla de utilizar):
http://ganda-csharp.blogspot.mx/2013/03/pasar-xml-stored-procedure-en-sqlserver.html
Espero que esto les sea de utilidad
----------------------------------------------------------
Lo que se puede imaginar... se puede programar
Suscribirse a:
Comentarios (Atom)