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
hola muy buen punto ya que no llamas n veces al procedimiento, tambien de puede enviar un datatable desde .net a sql server como parametro.
ResponderEliminarTu sabes como enviar ese xml en Oracle??
Hola Oscar, la verdad nunca he tenido la necesidad de hacerlo en Oracle, pero encontré este articulo donde pasan un tipo de dato xml, espere y te sirva, saludos.
Eliminarhttp://it.toolbox.com/blogs/oracle-guide/oracle-and-xml-in-action-a-real-world-example-5319