viernes, 26 de junio de 2009

XML en SQL Server 2005

Desde la versión 2000 SQL Server permite generar XML a partir de consultas a la base de datos, pero para que esos XML fueran legibles, era necesario hacer trucos de magia, como dirían en mi país, "enviar un cohete para la luna". Eso ha mejorado en SQL Server 2005 donde se pueden declarar variables tipo xml, entre otras mejoras. Ahora un ejemplo del XML resultante:

select top 3 name
from sysobjects where xtype = 'p'
order by crdate desc
for xml path('objects'), type, root('Root')

Resultado:

<Root>
<objects>
<name>Master</name>
</objects>
<objects>
<name>
Peoples</name>
</objects>
<objects>
<name>
Companies</name>
</objects>
</Root>

También, si deseamos insertar un registros o un grupo de registros lo podemos realizar por medio de un variable XML, a continuación les voy a mostrar un ejemplo que viene en la ayuda de Microsoft:

-- Se crean tabla para ser pobladas usando la función OPENXML.

CREATE TABLE Customers (CustomerID varchar(20) primary key,
ContactName varchar(20),
CompanyName varchar(20))
go
CREATE TABLE Orders( CustomerID varchar(20), OrderDate datetime)
go

--Variable que permite obtener el documento del XML.

DECLARE @docHandle int
declare @xmlDocument nvarchar(max) -- or xml type

set @xmlDocument = N'<ROOT>
<Customers CustomerID="XYZAA" ContactName="Joe" CompanyName="Company1">
<Orders CustomerID="XYZAA" OrderDate="2000-08-25T00:00:00"/>
<Orders CustomerID="XYZAA" OrderDate="2000-10-03T00:00:00"/>
<Customers>
<Customers CustomerID="XYZBB" ContactName="Steve" CompanyName="Company2">No Orders yet! </Customers>
</ROOT>'

EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument

-- La función OPENXML provee un rowset consistente con el orden de los datos.
INSERT Customers
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Customers')
WITH Customers

-- La función OPENXML provee un rowset consistente con el orden de los datos.
INSERT Orders
SELECT *
FROM OPENXML(@docHandle, N'//Orders')
WITH Orders

/* La función OPENXML se utiliza como si fuera una tabla temporal que almacena la inofrmación del XML.*/

SELECT * FROM OPENXML(@docHandle, N'/ROOT/Customers/Orders') WITH (CustomerID nchar(5) '../@CustomerID', OrderDate datetime)

-- Elimina la representación interna del XML.
EXEC sp_xml_removedocument @docHandle

No hay comentarios: