lunes, 10 de noviembre de 2008

Obtener el esquema de una tabla como un XML

Buenos dias hoy que estoy algo inspirado viendo lo del XML
encontere que SQL Server nos regresa una tabla de forma XML de 3 formas distintas
- FOR XML AUTO
- FOR XML RAW
- FOR XML EXPLICIT


A continuacion doy un pequeño ejemplo de cada uno pero lso dos primeros creo que con un query que hagan no nesecitaran mayor explicacion al tercero que es el personalizable lo tocare un poco mas a fondo para que puedan aprovechar lo al maximo

"FOR XML AUTO"

Hacemos un SELECT a una tabla la que mas nos llame en este caso yo use una que se llama Productos la cual contiene los siguientes datos









fiIdProductofiCategoriaProductofcNombreProducto
11Learning ASP in 24 hours version 1
21ASP and SQL 2000: The power to develop
32Beginners guide to eCommerce with ASP and XML
42Exploring VB.NET Beta 2
54Creating scalable web services using VB.NET
63Migrating from C++ to C#
76Using C# and ADO.NET


Y al aplicarle el "FOR XML AUTO" nos da el siguiente resultado

Query:
 
SELECT *
FROM Productos
FOR XML AUTO

Resultado:
 
<Productos fiIdProducto="1" fiCategoriaProducto="1" fcNombreProducto="Learning ASP in 24 hours version 1" />
<Productos fiIdProducto="2" fiCategoriaProducto="1" fcNombreProducto="ASP and SQL 2000: The power to develop" />
<Productos fiIdProducto="3" fiCategoriaProducto="2" fcNombreProducto="Beginners guide to eCommerce with ASP and XML" />
<Productos fiIdProducto="4" fiCategoriaProducto="2" fcNombreProducto="Exploring VB.NET Beta 2" />
<Productos fiIdProducto="5" fiCategoriaProducto="4" fcNombreProducto="Creating scalable web services using VB.NET" />
<Productos fiIdProducto="6" fiCategoriaProducto="3" fcNombreProducto="Migrating from C++ to C#" />
<Productos fiIdProducto="7" fiCategoriaProducto="6" fcNombreProducto="Using C# and ADO.NET" />


Como vemos la tabla nos la regreso como el nombre del nodo, las columna como atributos y los valores de las columnas son de acuerdo al renglon en donde se encuentran

El otro que vamos a ver es "FOR XML RAW" que es muy parecido al anteriro pero vamos a ver que hace

Query:
 
SELECT *
FROM Productos
FOR XML RAW

Resultado:
 
<row fiIdProducto="1" fiCategoriaProducto="1" fcNombreProducto="Learning ASP in 24 hours version 1" />
<row fiIdProducto="2" fiCategoriaProducto="1" fcNombreProducto="ASP and SQL 2000: The power to develop" />
<row fiIdProducto="3" fiCategoriaProducto="2" fcNombreProducto="Beginners guide to eCommerce with ASP and XML" />
<row fiIdProducto="4" fiCategoriaProducto="2" fcNombreProducto="Exploring VB.NET Beta 2" />
<row fiIdProducto="5" fiCategoriaProducto="4" fcNombreProducto="Creating scalable web services using VB.NET" />
<row fiIdProducto="6" fiCategoriaProducto="3" fcNombreProducto="Migrating from C++ to C#" />
<row fiIdProducto="7" fiCategoriaProducto="6" fcNombreProducto="Using C# and ADO.NET" />



En este caso fue muy parecido el resultado solo que en lugar de poner el nombre de la tabla como nombre de nodo nos maneja todos como de tipo "row"

Ahora el que le veo mayor potencia es el "FOR XML EXPLICIT" aqui nosotros podemos asignarle valores nombre y acomodar lso datos como mejor nos parezca y lo muestro mediante un PA que me llamo la atencion
de este link

http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1056855,00.html

donde muestran como regresar la estructura de una tabla mediante XML lo cual no lo hacen dificil sino engorroso pera verifiquenlo el metodo es muy generico y creo que puede servirles

Query:
 
-- Borra el stored procedure si este existe
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE SPECIFIC_SCHEMA = N'dbo'
AND SPECIFIC_NAME = N'paGetTablaXML'
)
DROP PROCEDURE dbo.paGetTablaXML
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Luis Felipe Segura Velasco
-- Modifier: Luis Felipe Segura Velasco
-- Create date: 10 de Noviembre de 2008
-- Modify date: 10 de Noviembre de 2008
-- Description: Procedimiento almacenado que nos muestra una tabla parseada como un XML
-- =============================================
CREATE PROCEDURE dbo.paGetTablaXML
@fcNombreTabla VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 1 1 AS Tag,
NULL AS Parent,
TABLE_NAME AS [Tabla!1!fcNombreTabla],
NULL AS [Columna!2]
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @fcNombreTabla

UNION ALL

SELECT 2 AS Tag,
1 AS Parent,
TABLE_NAME AS [Tabla!1!fcNombreTabla],
COLUMN_NAME AS [Columna!2]
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @fcNombreTabla
ORDER BY [Tabla!1!fcNombreTabla]
FOR XML EXPLICIT
END
-- =============================================
-- EXECUTE dbo.paGetTablaXML 'Productos'
-- =============================================
GO

Resultado:
 
<Tabla fcNombreTabla="Productos">

<Columna>fiIdProducto</Columna>

<Columna>fiCategoriaProducto</Columna>

<Columna>fcNombreProducto</Columna>

</Tabla>




Bueno acabamos de ver un pequeño ejemplo de como pueden aplicar el XML FOR EXPLICIT
pero desglosemos lo que vimos

1 AS Tag o 2 AS Tag

esto que es o para que sirve para darnos un identificador el cualnos va a servir para indicar el nivel de anidamiento

NULL AS Parent O 1 AS Parent

Esta columna nos indica cual es el nod padre de estas en el caso de los que tengan un Tag 1 casi se les debe de poner un Parent con valor NULL

Ahora la regla para especificar el nombre de las columnas es la siguiente

NombreDelElemento!NumeroDeTag!NombreDelAtributo!Directiva

Ejemplo: [Tabla!1!fcNombreTabla]


NombreDelElemento: nos da el nombre que se le pondra al nodo que tenemos
un en este caso Tabla que es la que identifica al Nodo padre

NumeroDeTag: indica el nivel de anidamiento en la que se encontrara para el ejemplo el 1 indica que es el nodo padre

NombreDelAtributo:Indica el nombre con el cual va a ser mostrado el atributo .Es la conducta que debe de tener si no se indica es tomado como el valor del nodo en el que se encuentre

Si la directiva es especificada y es de tipo xml, cdata, o element este valor es usado para construir un elemento hijo del NombreDelElemento y el valor de la columna es agregado

Directiva: Esta es opcional y puede ser usada para proveeer informacion adicional para construir el XML la directiva tiene 2 propositos

- Codificar valores como ID, IDREF, y IDREFS
- Tambien la puedes usar para indicar como mapear la cadena de datos a XML

Las palabras reservadas hide, element, elementxsinil, xml, xmltext, y cdata pueden ser usadas como directiva.

La directiva hide esconde el nodo es muy usual cuando solo regresas valores para el proposito de ordenamiento pero que no quieres que estos valores aparezcan en el XML

para mayor informacion acerca del uso del XML FOR EXPLICIT
http://msdn.microsoft.com/en-us/library/ms189068.aspx





No hay comentarios: