Dentro de la posibilidades de manejo de XML en SQL SERVER están:
Almacenamiento nativo de datos XML
Conversión de datos relacionales a estructuras XML por medio de la Clausula FOR XML
Realizar consultas por medio de la sentencia OPENXML
Usar expresiones XQUERY
Creación de Indexes XML
Validación de estructuras XML por medio Esquemas XML
Clausula FOR XML
Esta clausula sirve para transformar información relacional en documentos XML.
Sintaxis
FOR XML
{
{ RAW [ ( 'ElementName' ) ] AUTO }
[
[ , { XMLDATA XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]
[ , ELEMENTS [ XSINIL ABSENT ]
]
EXPLICIT
[
[ , XMLDATA ]
]
PATH [ ( 'ElementName' ) ]
[
[ , ELEMENTS [ XSINIL ABSENT ] ]
]
}
[ , BINARY BASE64 ]
[ , TYPE ]
[ , ROOT [ ( 'RootName' ) ] ]
Para los siguientes ejemplos utilizaremos la siguiente consulta a la BD AdventureWorks
El significado de los parámetros es el siguiente:
*RAW: Transforma cada fila en un elemento XML que tiene un identificador genérico.
Si se especifica RAW (indentificador) el resultado seria el siguiente:
*RAW: Transforma cada fila en un elemento XML que tiene un identificador genérico.
Si se especifica RAW (indentificador) el resultado seria el siguiente:
*EXPLICIT: especifica el formato de XML
La siguiente consulta devuelve un formato parecido a resultado del ejercicio anterior.
La siguiente consulta devuelve un formato parecido a resultado del ejercicio anterior.
*TYPE: Devuelve los resultados como tipo de datos XML
*XMLDATA: Incluye en los resultados el schema (XDR)
*XMLDATA: Incluye en los resultados el schema (XDR)
*XSINIL: crea elementos para los valores nulos
OPEN XML
OPEN XML Transforma datos XML en datos relacionales.
OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]])
[WITH (SchemaDeclaration TableName)]
Los siguientes ejemplos se realizaran basados en el siguiente XML
OPEN XML
OPEN XML Transforma datos XML en datos relacionales.
OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]])
[WITH (SchemaDeclaration TableName)]
Los siguientes ejemplos se realizaran basados en el siguiente XML
Para comenzar debemos declara las variable que almacenara el XML y el puntero al documento XML preparado
Después preparamos el documento para que nos pase el puntero que necesita el OPEN XML para realizar la consulta
Como podrán observar a la instrucción se le paso la variable @Hdoc que tiene el puntero a la representación del documento XML, se especifico la ruta @ '/ROOT/Customers/Orders/Order_Details' para tenerlo como referencia de búsqueda en los valores
Las variables que están en el Xpath se especifican con una @ mas el nombre del atributo, los que están en elementos superiores deben especificar tantos ../ necesarios para ubicarse en el elemento respectivo y los que están en elementos inferiores deben especificar la ruta .
Si se quiere extraer el contenido de un elemento se puede realizar especificando el xpath y en ves de utilizar @NombreVariable se coloca Text()
XQUERY
Es una herramienta que se utiliza para realizar consultas sobre fuentes de datos XML y esta implementado en los tipos de datos XML de sql server 2005
Posee 5 métodos:
*Query
*Value
*Exist
*Node
*Modify
Para la explicación vamos a utilizar el siguiente documento XML
Las variables que están en el Xpath se especifican con una @ mas el nombre del atributo, los que están en elementos superiores deben especificar tantos ../ necesarios para ubicarse en el elemento respectivo y los que están en elementos inferiores deben especificar la ruta .
Si se quiere extraer el contenido de un elemento se puede realizar especificando el xpath y en ves de utilizar @NombreVariable se coloca Text()
XQUERY
Es una herramienta que se utiliza para realizar consultas sobre fuentes de datos XML y esta implementado en los tipos de datos XML de sql server 2005
Posee 5 métodos:
*Query
*Value
*Exist
*Node
*Modify
Para la explicación vamos a utilizar el siguiente documento XML
Metodo Exist
Sirve para determinar la existencia de un nodo en el documento, devuelve 1 si encuentra alguna coincidencia en caso contrario devuelve 0
Metodo Modify (XML DML)
Sirve para insertar, modificar y eliminar nodos en un XML
Clausula insert
insert Expression1 (
{as first as last} into after before
Expression2 )
Metodo Nodes
Extrae los datos XML en formato relacional
Inserciones masivas
INSERT INTO Tbl_orders(Xmldata)
SELECT * FROM OPENROWSET(
BULK 'c:\Sybex\OpenRowsetXmldata.xml',
SINGLE_BLOB) AS x
Se utiliza Single_Blob ya que admite mas codificaciones de Windows
SINGLE_CLOB: lee los datos com ASCII
SINGLE_NLOB: lee los datos como Unicode
Índices XML
Para crear indices XML debe cumplirse los siguientes requerimientos
*La tabla que contiene la columna XML debe tener una llave primaria Closterado
*Si cambias la llave primaria debes eliminar todas los índices XML y volver a créalos después de realizar al cambio en la llave primaria
*Puedes tener un primary index xml por columna
*No se pueden tener un xml índice y un no xml índice con el mismo nombre en la mimas tabla
*No puedes usar las opciones IGNORE_DEP_KEY y ONLINE cuando creas el índice
*No puedes crear índices XML en vistas, Variable tipo tabla ni variables XML
*Debes eliminar un índice XML si quiere cambiar el tipo de índice
*Debes activar la opción ARITHABORT cuando creas un índice XML o cuando realizas alguna acción DML en la columna XML
Los índices XML están compuesto por un índice primario y un secundario
El índice XML primario realiza una representación B-tree delos nodos XML. La sintaxis de creación es la siguiente
CREATE PRIMARY XML INDEX PXML_ProductModel_CatalogDescription
ON Production.ProductModel (CatalogDescription)
El Índice XML secundario es un índice no Closterado del índice primario. Existen 3 tipos.
Índice PATH : mejora el rendimiento de consultas que utilizan PATH y VALUE para seleccionar datos, como por ejemplo la consultas que utilizan el método exist en el where de una consulta. /ItemList/Item[@ProductID="1"]
CREATE XML INDEX XMLPATH_ProductModel_CatalogDescription
ON Production.ProductModel(CatalogDescription)
USING XML INDEX PXML_ProductModel_CatalogDescription
FOR PATH
Indice VALUE: mejora el rendimiento de consultas que utilizan VALUES para seleccionar datos. Ideal para busquedas de un valor que puede aparecer en diferentes partes del xml. //Item[@ProductID="1"]
CREATE XML INDEX XMLVALUE_ProductModel_CatalogDescription
ON Production.ProductModel(CatalogDescription)
USING XML INDEX PXML_ProductModel_CatalogDescription
FOR VALUE
Indice PROPERTY: mejora el rendimiento de consultas que utilizan VALUES para extraer datos-(/ItemList/Item/@ProductID)[1]
CREATE XML INDEX XMLPROPERTY_ProductModel_CatalogDescription
ON Production.ProductModel(CatalogDescription)
USING XML INDEX PXML_ProductModel_CatalogDescription
FOR PROPERTY
INSERT INTO Tbl_orders(Xmldata)
SELECT * FROM OPENROWSET(
BULK 'c:\Sybex\OpenRowsetXmldata.xml',
SINGLE_BLOB) AS x
Se utiliza Single_Blob ya que admite mas codificaciones de Windows
SINGLE_CLOB: lee los datos com ASCII
SINGLE_NLOB: lee los datos como Unicode
Índices XML
Para crear indices XML debe cumplirse los siguientes requerimientos
*La tabla que contiene la columna XML debe tener una llave primaria Closterado
*Si cambias la llave primaria debes eliminar todas los índices XML y volver a créalos después de realizar al cambio en la llave primaria
*Puedes tener un primary index xml por columna
*No se pueden tener un xml índice y un no xml índice con el mismo nombre en la mimas tabla
*No puedes usar las opciones IGNORE_DEP_KEY y ONLINE cuando creas el índice
*No puedes crear índices XML en vistas, Variable tipo tabla ni variables XML
*Debes eliminar un índice XML si quiere cambiar el tipo de índice
*Debes activar la opción ARITHABORT cuando creas un índice XML o cuando realizas alguna acción DML en la columna XML
Los índices XML están compuesto por un índice primario y un secundario
El índice XML primario realiza una representación B-tree delos nodos XML. La sintaxis de creación es la siguiente
CREATE PRIMARY XML INDEX PXML_ProductModel_CatalogDescription
ON Production.ProductModel (CatalogDescription)
El Índice XML secundario es un índice no Closterado del índice primario. Existen 3 tipos.
Índice PATH : mejora el rendimiento de consultas que utilizan PATH y VALUE para seleccionar datos, como por ejemplo la consultas que utilizan el método exist en el where de una consulta. /ItemList/Item[@ProductID="1"]
CREATE XML INDEX XMLPATH_ProductModel_CatalogDescription
ON Production.ProductModel(CatalogDescription)
USING XML INDEX PXML_ProductModel_CatalogDescription
FOR PATH
Indice VALUE: mejora el rendimiento de consultas que utilizan VALUES para seleccionar datos. Ideal para busquedas de un valor que puede aparecer en diferentes partes del xml. //Item[@ProductID="1"]
CREATE XML INDEX XMLVALUE_ProductModel_CatalogDescription
ON Production.ProductModel(CatalogDescription)
USING XML INDEX PXML_ProductModel_CatalogDescription
FOR VALUE
Indice PROPERTY: mejora el rendimiento de consultas que utilizan VALUES para extraer datos-(/ItemList/Item/@ProductID)[1]
CREATE XML INDEX XMLPROPERTY_ProductModel_CatalogDescription
ON Production.ProductModel(CatalogDescription)
USING XML INDEX PXML_ProductModel_CatalogDescription
FOR PROPERTY
No hay comentarios:
Publicar un comentario