XMLConSQL

66
16 capítulo 16 24/1/2002 11:08 Page 1

description

Manual XML con TSql

Transcript of XMLConSQL

  • 16 captulo 16 24/1/2002 11:08 Page 1

  • 16 captulo 16 24/1/2002 11:08 Page b

  • Copyright 2001 PEARSON EDUCATION S.A.

    Trabajar con datos XMLen SQL Server 2000

    SQL Server 2000 puede usar protocolos y estndares propios de Internetpara comunicarse con otras aplicaciones y otros sistemas. El lenguajeextensible de marcacin, o XML (eXtensible Markup Language) es elformato estndar de facto para la comunicacin entre aplicaciones enInternet.

    En este captulo aprenderemos de qu manera SQL Server usa lastecnologas de la Web y XML para proveer una comunicacin independientede la plataforma. Ser solamente una introduccin a este tema amplio ymuy difundido; para una discusin ms completa del funcionamiento deXML en general remitimos al lector a algn libro sobre XML, por ejemplo elde Benot Marchal, XML con Ejemplos. En este captulo aprenderemos losiguiente:

    Los conceptos bsicos de XML

    Cmo leer datos en formato XML en SQL Server 2000

    El uso de documentos XML en Transact-SQL

    Cmo acceder a SQL Server a travs de HTTP

    El uso de updategrams XML para modificar, insertar y eliminar datosen SQL Server

    16

    16 captulo 16 24/1/2002 11:08 Page 1

  • Breve introduccin a XMLCada aplicacin de computadora usa sus propios tipos de datos y los almacenaen un formato interno propio. La comunicacin entre aplicaciones es unaoperacin compleja que requiere llegar a un acuerdo acerca del formato de lacomunicacin. Si las aplicaciones se ejecutan en plataformas de hardware y desistema operativo diferentes, la situacin se hace an ms compleja.

    El lenguaje de marcacin extensible (XML) alivia esta situacin. XML provee unformato autodescriptivo para expresar datos semiestructurados en formato detexto puro, compatible con la mayora de los sistemas informticos.

    El listado 16.1 muestra un documento XML tpico. Para crear un documento XMLse puede usar cualquier editor de texto, por ejemplo el Bloc de notas.

    Listado 16.1: Un documento XML tpico

    Internet Explorer 5.5 es capaz de abrir documentos XML. Si guarda el documentodel listado 16.1 con la extensin XML y luego lo abre en Internet Explorer, veruna imagen similar a la figura 16.1.

    Figura 16.1: Internet Explorer se puede usar como visor de XML.

    2 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:08 Page 2

  • En el documento XML del listado 16.1 podemos ver diferentes secciones. La etiquetaque sigue es una instruccin para el procesador que identifica el documento comodocumento XML, adems de la versin de XML usada:

    Esto es solamente un comentario dentro del documento:

    La etiqueta siguiente identifica el elemento raz descrito por este documento. Tododocumento XML bien formado debe tener un elemento raz. Este documentodescribe productos:

    Cada una de las lneas siguientes describe un elemento en particular (un producto,en este caso) e indica tres atributos para cada producto: ProductID, ProductName yUnitPrice (el identificador, el nombre y el precio unitario, respectivamente). Paracada atributo, el documento indica el nombre del atributo y el valor que tiene eseatributo para cada producto en particular. El smbolo / al final de cada lnearepresenta el final de la definicin del elemento individual. En este caso es unasimplificacin de la sintaxis formal .

    Estas tres lneas tambin se pueden escribir as:

    Al final del documento XML, debe haber una etiqueta de cierre que marque el finde la definicin del elemento raz.

    P R E C A U C I N

    Observe que en XML se distingue entre maysculas y minsculas. Si la etiqueta de iniciode un elemento y la de cierre no coinciden en el uso de maysculas y minsculas, se producirun error de sintaxis de XML. Por ejemplo, el listado 16.2 produce el mensaje de error queaparece en la salida incluida. La nica diferencia entre el listado 16.1 y el 16.2 es que en esteltimo la etiqueta de cierre empieza con minsculas y la etiqueta de inicio conmaysculas; la etiqueta de cierre debera haber sido .

    3Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:08 Page 3

  • Listado 16.2: Este documento produce un error porque el uso de maysculas y minsculas difiere en la etiqueta decierre y en la etiqueta de inicio

    The XML page cannot be displayedCannot view XML input using XSL style sheet.Please correct the error and then click the Refresh button,or try again later.--------------------------------------------------------------------------------End tag products does not match the start tag Products. Line 8, Position 3

    --^

    En ocasiones es preferible definir los atributos como elementos independientes. Estopuede resultar de utilidad si los datos se deben describir organizadosjerrquicamente. El listado 16.3 muestra el mismo documento XML que ellistado 16.1, pero en este caso hemos definido cada atributo como un elementoindependiente. La figura 16.2 muestra este documento en Internet Explorer.Observe la diferencia entre esta figura y la 16.1.

    Listado 16.3: Documento XML tpico en el que los atributos estn definidos como elementos

    1Chai18.0000

    2Chang19.0000

    3Aniseed Syrup10.0000

    4 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    E J E M P L O

    E J E M P L O

    16 captulo 16 24/1/2002 11:08 Page 4

  • Figura 16.2: Documento XML organizado en torno a los elementos.

    El listado 16.4 muestra un ejemplo de una estructura jerrquica en XML. Lafigura 16.3 muestra cmo se ve este documento en Internet Explorer. La figura16.4 muestra la representacin de este documento XML como un rbol en el que acada elemento le corresponde un nodo en la estructura del rbol.

    Listado 16.4: Un documento XML puede representar datos organizados jerrquicamente

    5Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:08 Page 5

  • Listado 16.4: continuacin

    6 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:08 Page 6

  • Figura 16.3: Vista del documento XML organizado jerrquicamente en InternetExplorer.

    Como puede ver en las figuras 16.3 y 16.4, este documento XML contiene variosniveles jerrquicos:

    Un nivel raz, llamado Customers, que define el propsito de los datos deeste documento XML (en este caso, la descripcin de clientes).

    Un elemento Customer para cada cliente. Este elemento contiene unatributo Name que en este caso muestra el nombre de la compaa.

    Un elemento Order para cada pedido formulado por este cliente enparticular. Este elemento muestra como atributo la fecha del pedido.

    Para cada pedido, un elemento Product para cada producto incluido en esepedido en particular. Para cada producto el documento muestra comoatributos el nombre del producto, su precio unitario y la cantidad pedida.

    Al observar los ejemplos precedentes, el lector podra preguntarse por quhabramos de usar este formato XML en lugar del formato de salida estndar deSQL Server que devuelven las diversas bibliotecas de base de datos. Las razonesprincipales son la compatibilidad y la versatilidad.

    Todos los sistemas informticos aceptan e interpretan archivos de texto; porende, todos aceptan documentos XML. Por el contrario, no todos los sistemas puedeninterpretar un conjunto de resultados devuelto en el formato puro TDS (Tabular

    7Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:08 Page 7

  • Data Stream) de SQL Server. Y no todos los sistemas tienen bibliotecas de base dedatos a su disposicin para conectarse a SQL Server e interpretar paquetes TDS.

    Figura 16.4: Representacin grfica de un documento XML organizadojerrquicamente.

    Si el lector observa los ejemplos dados, ver que los documentos XML no incluyennada acerca del formato que se usar para presentarlos. El documento contieneexclusivamente datos y sus definiciones, pero no instrucciones de formato. ste esun aspecto importante de los documentos XML: son altamente verstiles en lo querespecta al modo que uno elige para su presentacin.

    Para definir el formato a usar para la presentacin de documentos XML, sepueden usar hojas de estilo, que se definen en el lenguaje extensible de hojas deestilo (XSL, eXtensible Stylesheet Language).

    El listado 16.5 muestra un ejemplo de la forma en que se puede cambiar elformato de presentacin de un documento XML suministrando el archivo XSL

    8 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    Product Gustaf...Order 1996-07-08 Product Ravioli...

    Product Louisiana...

    Order 1996-10-21 Product Filo...Product Scottish...

    Order 1997-02-19 Product IkuraProduct Tourtiere

    Product Uncle...Order 1997-02-27 Product Spegesild...

    Product Mozzare...

    Order 1997-03-18 Product Ikura

    Product Uncle...Order 1997-05-23 Product Steeleye...

    Product Tarte...Product Chang

    Order 1997-12-31 Product Louisiana...Product Longlife...

    Product Queso...Order 1996-07-04 Product Singap...

    Product Mozzare...

    Order 1996-08-06 Product Flotem...Product Mozzare...

    Order 1996-09-02 Product Gnocchi...

    Order 1997-11-11 Product KonbuProduct Jack...

    Order 1997-11-12 Product Inglad...Product Filo...

    {{

    {{{{{{{

    {{{{{

    CustomerVictuailles

    en stock

    Customers

    CustomerVins and Alcohols

    Chevalier

    16 captulo 16 24/1/2002 11:08 Page 8

  • apropiado. El listado define una hoja de estilo pensada para aplicarle un formatoal documento del listado 16.1. El listado 16.6 muestra el documento del listado16.1, con una referencia al archivo XSL. La figura 16.5 muestra cmo se ve lasalida formateada en Internet Explorer.

    Figura 16.5: As se ve un documento XML en Internet Explorer despus de aplicarleun sencillo archivo XSL.

    Listado 16.5: Un archivo XSL

    Lista de productos

    ProductoNombrePrecio

    9Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:08 Page 9

  • Listado 16.6: Agregado de una referencia al archivo XSL en el documento XML

    El principal beneficio de esta tcnica es que permite dividir las tareas dedesarrollo entre las que tienen que ver con los datos en s mismos y las que serefieren al formato que se les aplicar. El equipo de diseadores Web puedeconcentrarse en cmo darles a las pginas Web una buena apariencia, mientrasque el equipo de programacin de datos puede concentrarse en la exactitud y laconsistencia de los datos, sin preocuparse acerca de su presentacin.

    El listado 16.7 muestra un archivo XSL diferente, que cambia el formato deldocumento XML previo. La figura 16.6 muestra cmo se ver en Internet Explorerel documento XML del listado 16.6, despus de slo cambiar la siguiente lnea decdigo para hacer referencia al nuevo archivo XSL:

    De esta manera se puede cambiar fcilmente la apariencia de un sitio Web por completo,sin afectar la lgica de la programacin o los datos disponibles en los archivos XML.

    Figura 16.6: Presentacin de un documento XML en Internet Explorer, despus deaplicarle un archivo XSL con instrucciones de formato ms complejas.

    10 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    Lista de productosProducto Nombre Precio1

    23

    ChaiChangAnissed Syrup

    18.000

    19.00010.000

    16 captulo 16 24/1/2002 11:08 Page 10

  • Listado 16.7: Un archivo XSL con directivas de formato

    Lista de productos

    .subject {font-family: Garamond;font-weight: bold;font-size: 48;

    }.headings {

    font-family: Garamond;font-weight: bold;font-size: 24;

    }.productname {

    font-family: Garamond;font-weight: bold;font-size: normal;

    }

    Lista de productos

    ProductoNombrePrecio

    11Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:08 Page 11

  • Listado 16.7: continuacin

    El estudio de las posibilidades que ofrece este lenguaje poderoso y a la vez simpleest ms all del alcance de este libro. Puede aprender ms acerca de XML con ellibro XML by Example (Benot Marchal, QUE, ISBN 0-7897-2242-9).

    Soporte de XML en SQL Server 2000SQL Server 2000 es un nuevo servidor empresarial .NET, diseado para proveerservicios back-end de datos a otros servidores empresariales .NET y aplicaciones.NET. En esta estrategia le toca un importante papel a SQL Server.

    XML se puede usar en SQL Server 2000 de las siguientes formas:

    Obtener datos de SQL Server en formato XML, mediante la nuevaextensin de Transact-SQL FOR XML. Este formato es conveniente cuando setrata de integrar estos datos con pginas ASP.

    Abrir datos expresados en XML como un conjunto de resultados desdeTransact-SQL, mediante la nueva funcin OPENXML.

    Acceder a SQL Server 2000 a travs de Internet mediante una conexin HTTP.

    Usar el proveedor mejorado OLE DB de SQL Server y la biblioteca de basede datos ADO con soporte extendido para XML para enviar consultas XMLy recibir resultados en XML, mediante el nuevo objeto Stream.

    Usar updategrams XML para insertar, eliminar o modificar datos de SQL Server.

    Usar el componente de carga masiva XML para importar datos XML a SQLServer 2000. En este captulo no nos ocuparemos de esta herramienta. Paraaprender a usarla puede revisar la documentacin instalada como parte delcomponente de soporte para XML e Internet en SQL Server (SQL ServerXML and Internet SupportWeb Release 1).

    Este soporte para XML facilita el uso de SQL Server 2000 en Internet y suintegracin con otros servidores empresariales .NET, por ejemplo MicrosoftBiztalk Server 2000.

    El acceso a SQL Server a travs de HTTP lo suministra una extensin de InternetInformation Server (SQLISAPI.DLL) por medio de un directorio virtualespecialmente definido.

    El proveedor SQLOLEDB ha sido mejorado para suministrar diversos servicios:

    Traduccin de plantillas XML a instrucciones SELECT ... FOR XML.

    Traduccin de consultas XPath a instrucciones SELECT ... FOR XML.

    12 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:08 Page 12

  • Traduccin de updategrams XML a las correspondientes instrucciones Transact-SQL INSERT, DELETE y UPDATE.

    En las secciones que siguen aprenderemos acerca del uso de estas nuevas prestaciones.Como ya hemos mencionado, esto no es ms que una introduccin a esta tecnologaextremadamente amplia. Los ejemplos contenidos en este captulo estn pensadospara guiar al lector a travs de las primeras etapas de su aventura con XML.

    Lectura de datos desde SQL Server en formato XMLSQL Server 2000 puede generar conjuntos de resultados directamente en formatoXML. Esta opcin simplifica el manejo de los datos desde el lado del cliente, sobretodo con pginas ASP.

    Cuando SQL Server 2000 tiene que producir datos en formato XML, hay uncomponente interno que se encarga de traducir el conjunto de filas interno a un flujode datos XML. El componente que se usar depende del modo de XML seleccionado.

    SQL Server enva el flujo XML a la aplicacin cliente, y para la presentacin delos datos se usan las capacidades de formato que hubiera disponibles en elservidor o en la computadora cliente.

    El analizador de consultas no puede interpretar correctamente datos en XML,porque no usa el analizador sintctico de XML en lo absoluto; muestra los flujosXML como una secuencia de filas de texto, cada una de ellas de hasta 2.033 bytesde largo. El propsito de estas extensiones de Transact-SQL es permitir el accesoa datos provenientes de SQL Server en formato XML desde conexiones HTTP odesde aplicaciones web, y no desde el analizador de consultas.

    N O T AMs adelante en este captulo, en la seccin Acceso a SQL Server a travs de HTTP, aprenderemosa configurar Internet Information Server de modo que provea acceso a SQL Server por medio de HTTP.Puede seguir esas instrucciones para habilitar el acceso HTTP a SQL Server y luego ejecutar losejercicios de esta seccin mediante Internet Explorer, para leer directamente los resultados en XML.

    Uso de la clusula FFOORR XXMMLLPara obtener datos en formato XML se usa la nueva extensin FOR XML de lainstruccin SELECT. El listado 16.8 muestra una sencilla instruccin SELECT que obtienedatos en formato XML, y cmo se ve en el analizador de consultas la salida producida.Listado 16.8: Uso de FOR XML para producir resultados en formato XML

    USE NorthwindGO

    SELECT CategoryID, CategoryName, DescriptionFROM CategoriesFOR XML AUTO

    13Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 13

  • Listado 16.8: continuacin

    XML_F52E2B61-18A1-11d1-B105-00805F49916B

    --------------------------------------------------------

    (8 filas afectadas)

    P R E C A U C I N

    Ajuste la cantidad mxima de caracteres por columna en el analizador de consultas a un valormayor que 2.033, o algunos de los ejemplos de esta seccin saldrn cortados.

    Para ajustar esta opcin puede ir a Herramientas, Opciones y entrar a la ficha Resultados.

    En el listado 16.8 y en su salida podemos ver ciertos detalles de inters:

    Las nicas palabras clave adicionales que le enviamos a SQL Server sonFOR XML AUTO al final de una instruccin SELECT comn.

    Vista en el analizador de consultas, la salida muestra una sola columna conun nombre extravagante: XML seguido de una expresin tipo GUID(identificador global nico).

    Toda la salida va a una sola lnea, pero aun as la cuenta de filas afectadasindica 8 filas. La lnea de salida es muy larga e incluye todo el conjunto deresultados.

    Copie la lnea del panel de resultados del analizador de consultas al bloc de notasy agregue algunos retornos de carro y tabulaciones en los lugares apropiados,para dar a los resultados una apariencia ms propia de un documento XML (vaseel listado 16.9).

    14 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 14

  • Listado 16.9: La salida de una consulta que us la clusula FOR XML, luego de formatearla manualmente

    Guarde este documento en un archivo con el nombre xmlListing9.xml y trate deabrirlo en Internet Explorer. Recibir el mensaje de error de la figura 16.7, porqueesta salida XML no es un documento XML bien formado, contiene ms de unelemento raz. Esta clase de documento recibe el nombre de fragmento dedocumento XML.

    Vuelva a editar el documento y agregue un nuevo nodo raz (vase el listado 16.10).Ahora podr abrir este documento en Internet Explorer sin ningn problema.

    15Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 15

  • Figura 16.7: La salida directa de la clusula FOR XML no es un documento XMLbien formado.

    Listado 16.10: Agregarle un nodo raz convierte la salida XML en un documento XML bien formado

    16 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 16

  • Listado 16.10: continuacin

    Sin embargo, se pueden usar alias para producir una salida que mejore losnombres de los elementos, como en la consulta del listado 16.11. Una convencinde nombres que mejorara la legibilidad sera usar el nombre de la tabla ensingular para denominar cada elemento.

    Como ejemplo podemos usar el alias Category para la tabla Categories, de modoque cada elemento de la salida XML lleve el nombre Category. El listado 16.12muestra la salida, despus de agregar el nodo raz Categories para completar elfragmento XML producido por esta consulta.

    Listado 16.11: Uso de alias de tabla y de columna para mejorar el uso de nombres en la salida XML

    USE NorthwindGO

    SELECT CategoryID as ID,CategoryName as Name,DescriptionFROM Categories as CategoryFOR XML AUTO

    Listado 16.12: La salida del listado 16.11, despus de agregarle el nodo raz Categories

  • Listado 16.12: continuacin

    Name="Dairy Products"Description=Cheeses/>

    En los ejemplos precedentes, para la salida XML seleccionamos el modo AUTO.SQL Server admite los modos siguientes:

    RAW: produce un flujo XML con elementos independientes para cada fila,donde cada elemento recibe el nombre row (independientemente del nombrede la tabla).

    AUTO: produce un flujo XML con elementos independientes para cada fila, dondecada elemento recibe el nombre de la tabla de la que se extrajeron los datos.

    EXPLICIT: produce una tabla universal que permite un control ms estrechode la forma de organizacin de los datos XML.

    N O T A

    El modo EXPLICIT excede los objetivos de este captulo. Si est interesado en obtener infor-macin detallada acerca de este modo de XML puede buscar esa informacin y ejemplos rela-cionados en los libros en pantalla o asistir al curso curricular oficial de Microsoft 2091A,Building XML-Enabled Applications Using Microsoft SQL Server 2000.

    El listado 16.13 muestra la misma consulta que el 16.11, pero en modo RAW, con susalida no formateada. Como puede apreciar en la salida, la principal diferenciaest en el nombre de los elementos, que en este caso siempre es row.

    Listado 16.13: Uso de FOR XML RAW para producir resultados en formato XML

    USE NorthwindGO

    18 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 18

  • Listado 16.13: continuacin

    SELECT CategoryID as ID,CategoryName as Name,DescriptionFROM Categories as CategoryFOR XML RAW

    XML_F52E2B61-18A1-11d1-B105-00805F49916B--------------------------------------------------

    (8 filas afectadas)

    Sin embargo, si la instruccin SELECT lee datos de ms de una tabla hay una grandiferencia entre cmo trabajan los modos RAW y AUTO. El listado 16.14 muestra lamisma consulta en ambos formatos, con sus correspondientes salidas.

    Listado 16.14: Comparacin de los modos RAW y AUTO cuando se ejecutan consultas sobre varias tablas

    USE NorthwindGO

    SELECT CategoryName,ProductNameFROM Categories as CategoryJOIN Products as ProductON Product.CategoryID = Category.CategoryIDWHERE Product.CategoryID < 3ORDER BY CategoryName, ProductNameFOR XML RAW

    SELECT CategoryName,ProductNameFROM Categories as CategoryJOIN Products as ProductON Product.CategoryID = Category.CategoryIDWHERE Product.CategoryID < 3ORDER BY CategoryName, ProductNameFOR XML AUTO

    19Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 19

  • Listado 16.14: continuacin

    XML_F52E2B61-18A1-11d1-B105-00805F49916B------------------------------------------------

    (24 filas afectadas)

    XML_F52E2B61-18A1-11d1-B105-00805F49916B------------------------------------------------

    20 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 20

  • Listado 16.14: continuacin

    (24 filas afectadas)

    En la salida precedente se puede ver que el modo AUTO muestra automticamentelos datos organizados en forma jerrquica. Esto es adecuado para la mayora delas aplicaciones, porque de esta manera el usuario puede expandir la jerarquapara examinar niveles ms profundos de detalle, si fuera necesario.

    Con el modo AUTO se puede usar la opcin ELEMENTS para mostrar los atributoscomo elementos (vase el listado 16.15).

    Listado 16.15: Uso de la opcin ELEMENTS para mostrar los atributos como elementos

    USE NorthwindGO

    SELECT CategoryName,ProductNameFROM Categories as CategoryJOIN Products as ProductON Product.CategoryID = Category.CategoryIDWHERE Product.CategoryID

  • Listado 16.15: continuacin

    Chang

    Chartreuse verte

    Cte de Blaye

    Guaran Fantstica

    Ipoh Coffee

    Lakkalikri

    Laughing Lumberjack Lager

    Outback Lager

    Rhnbru Klosterbier

    Sasquatch Ale

    Steeleye Stout

    Condiments

    Aniseed Syrup

    Chef Anton's Cajun Seasoning

    Chef Anton's Gumbo Mix

    22 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 22

  • Listado 16.15: continuacin

    Genen Shouyu

    Grandma's Boysenberry Spread

    Gula Malacca

    Louisiana Fiery Hot Pepper Sauce

    Louisiana Hot Spiced Okra

    Northwoods Cranberry Sauce

    Original Frankfurter grne Soe

    Sirop d'rable

    Vegie-spread

    (24 filas afectadas)

    Se puede usar la opcin XMLDATA para que la salida produzca un esquema XML,como en el listado 16.16.

    Listado 16.16: Uso de la opcin XMLDATA para incluir un esquema XML en la salida

    USE NorthwindGO

    SELECT CategoryName,ProductNameFROM Categories as CategoryJOIN Products as ProductON Product.CategoryID = Category.CategoryIDWHERE Product.CategoryID

  • Listado 16.16: continuacin

    XML_F52E2B61-18A1-11d1-B105-00805F49916B

    (24 filas afectadas)

    24 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 24

  • Como puede ver, la salida del listado 16.16 es igual a la de la segunda consulta dellistado 16.14. La nica diferencia es la presencia de la informacin del esquema alprincipio de la salida. Esta informacin se puede usar para crear un archivo XDR(XML Data Reduced, XML simplificado).

    P R E C A U C I N

    Si trata de leer las salidas de los listados 16.14 a 16.16 directamente en Internet Explorer seproducirn errores de sintaxis de XML, a menos que aada un nodo raz vlido y guarde estassalidas en formato Unicode desde el Bloc de notas.

    Lectura de datos en XML de SQL Server desde pginas ASPAunque este no es un libro sobre ASP, es interesante mostar al menos un ejemplode cmo escribir una sencilla aplicacin ASP (Active Server Pages, pginas activas deservidor) para leer datos de SQL Server en formato XML.

    Para una comprensin cabal de la creacin de pginas ASP puede leer el libroActive Server Pages 3.0 con ejemplos, (Bob Reselman, Prentice Hall, ISBN 987-9460-11-1). Trabajar con ASP requiere conocimiento de scripting y ciertacomprensin de HTML.

    En esta seccin aprenderemos a escribir una sencilla pgina ASP que leer eldocumento XML producido por la segunda consulta del listado 16.14.

    Para escribir la pgina ASP puede usar el bloc de notas o cualquier otro editor detexto. El listado 16.17 contiene el cdigo completo de la pgina ASPSQLXML.ASP. Para que este cdigo funcione, debe guardar el archivo en undirectorio que est bajo la administracin de Internet Information Server. En esteejemplo crearemos un directorio con el nombre XML dentro de la rutapredeterminada para las pginas web (c:\InetPub\wwwroot).

    El script contiene dos reas principales:

    Script de servidor. Esta seccin incluye la parte principal de la lgica de laprogramacin. Aqu nos conectamos a SQL Server para obtener la informacinrequerida. Estas instrucciones se ejecutan en la computadora servidora(Internet Information Server), que no las enva a la computadora cliente.

    Script de cliente. Esta seccin muestra los resultados en el lugar y la formaque necesitamos. Estas instrucciones se ejecutan en la computadora cliente.

    Ambas reas estn convenientemente sealadas en el cdigo con comentarios.

    Listado 16.17: Una sencilla pgina ASP que lee una consulta SQL con FOR XML AUTO

    25Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 25

  • Listado 16.17: continuacin

    SQL-XML con ejemplos - SQLXML.asp

  • Listado 16.17: continuacin

    Dim adoCmdSet adoCmd = Server.CreateObject(ADODB.Command)Set adoCmd.ActiveConnection = adoConn

    Comienzo de la peticin XML

    Dim sQuerysQuery = sQuery = sQuery &

    Esta es la consulta del listado 16.14

    sQuery = sQuery & SELECT CategoryName, sQuery = sQuery & ProductName sQuery = sQuery & FROM Categories as Category sQuery = sQuery & JOIN Products as Product sQuery = sQuery & ON Product.CategoryID = Category.CategoryID

    Observe que tenemos que cambiar el smbolo < a < porque el carcter < est reservado en XML y en este listado, la consulta ir encerrada en un flujo XML

    sQuery = sQuery & WHERE Product.CategoryID < 3 sQuery = sQuery & ORDER BY CategoryName, ProductName sQuery = sQuery & FOR XML AUTO

    Ya podemos terminar la peticin XML

    sQuery = sQuery &

    Creamos y abrimos el objeto Stream

    Dim adoStreamQuerySet adoStreamQuery = Server.CreateObject(ADODB.Stream)adoStreamQuery.Open

    Escribimos la consulta XML dentro del objeto Stream

    adoStreamQuery.WriteText sQuery, adWriteCharadoStreamQuery.Position = 0

    Seleccionamos el objeto Stream como comando a ejecutar Observe el GUID para la propiedad Dialect, que en este caso representa el formato MSSQLXML

    27Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 27

  • Listado 16.17: continuacin

    adoCmd.CommandStream = adoStreamQueryadoCmd.Dialect = {5D531CB2-E6Ed-11D2-B252-00C04F681B71}

    Ahora indicaremos que la salida vaya al objeto Response, que tambin es un objeto Stream

    adoCmd.Properties(Output Stream) = Response

    Definimos la salida XML como una isla de datos con el nombre CatalogIsle, que se usar para la ejecucin del lado del cliente

    Response.write adoCmd.Execute , , adExecuteStreamResponse.write

    %>

    Este es el script de cliente, que ser visible para el navegador cliente

    Dim xmlDocdim OutputXML

    Obtenemos una referencia a la isla de datos que contiene los resultados XML

    Set xmlDoc = CatalogIsle.XMLDocument

    Dim root, CChild, PChild

    Obtenemos una referencia al nodo raz del documento XML

    Set root = xmlDoc.documentElement

    Exploramos el primer nivel del rbol, leyendo cada categora. Mostramos el atributo CategoryName en negrita

    For each CChild in root.childNodesOutputXML = document.all(log).innerHTMLdocument.all(log).innerHTML = OutputXML & &

    CChild.getAttribute(CategoryName) &

    Para cada categora, exploramos el siguiente nivel del rbol,

    28 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 28

  • Listado 16.17: continuacin

    leyendo cada producto perteneciente a la categora. Mostramos el nombre del producto en tipografa normal

    For each PChild in CChild.childNodesOutputXML = document.all(log).innerHTMLdocument.all(log).innerHTML = OutputXML & &

    PChild.getAttribute(ProductName) & Next

    Next

    SQL-XML con ejemplosEste es el catlogo de productos

    para las categoras 1 y 2

    Si observa el listado 16.17 encontrar la siguiente lnea al principio del archivo:

    Es importante indicar UTF-8 (Unicode Transformation Format que codifica cadacdigo UNICODE como una secuencia de uno a cuatro bytes) conjunto decaracteres, ya que los datos que presentaremos en este caso contienen caracteresque no se encuentran en el conjunto de caracteres estndar.

    El proceso seguido por esta pgina ASP es:

    1. Creamos un objeto Connection, llamado en este ejemplo adoConn, y loconectamos a SQL Server.

    2. Creamos un objeto Stream, llamado en este ejemplo AdoStreamQuery, paradefinir la consulta XML que enviaremos a SQL Server.

    3. Creamos un objeto Command, que en este ejemplo se llama adoCmd, paraenviar a SQL Server la consulta definida por el objeto Stream y mandar losresultados directamente al objeto Response.

    4. Ejecutamos el objeto Command, incluyendo los resultados en una isla dedatos llamada CatalogIsle. De esta forma, el script de cliente tendr unacceso fcil a los datos.

    Lo nico que tiene el script de cliente es un bucle doble para recorrer las categoras ytodos los productos de cada categora.

    A lo largo del cdigo hallar gran cantidad de comentarios que describen elpropsito de cada instruccin.

    29Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 29

  • Si abre este archivo con Internet Explorer (usando el URLhttp://localhost/XML/SQLXML.ASP) podr ver la misma salida que en lafigura 16.8.

    Figura 16.8: Ejecucin de SQLXML.ASP en Internet Information Server para leerdatos desde SQL Server.

    Ahora, veamos lo que el usuario encuentra si abre el script de cliente. En InternetExplorer, vaya al men Ver y elija Cdigo fuente. Se abrir el bloc de notas ymostrar el cdigo fuente de la pgina, que es el que muestra el listado 16.18.Como puede ver, el script de servidor (incluyendo la cadena de conexin y laconsulta SQL que lee los datos) est oculto desde el punto de vista del cliente.

    Observe en el listado 16.18 que la primera parte incluye la isla de datos quecontiene el resultado de la consulta en formato XML. Adems, en el documentoHTML final se han eliminado automticamente todos los comentarios.

    Listado 16.18: Este es el cdigo fuente de la pgina HTML que recibe el cliente

    SQL-XML con ejemplos - SQLXML.asp

    30 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    ChaiChangChartreuse verteCte de BlayeGuaran FantsticaIpoh CoffeeLakkalikri

    16 captulo 16 24/1/2002 11:09 Page 30

  • Listado 16.18: continuacin

    Dim xmlDocdim OutputXMLSet xmlDoc = CatalogIsle.XMLDocument

    Dim root, CChild, PChildSet root = xmlDoc.documentElement

    For each CChild in root.childNodesOutputXML = document.all(log).innerHTMLdocument.all(log).innerHTML = OutputXML & &

    CChild.getAttribute(CategoryName) &

    For each PChild in CChild.childNodesOutputXML = document.all(log).innerHTML

    31Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 31

  • Listado 16.18: continuacin

    document.all(log).innerHTML = OutputXML & &PChild.getAttribute(ProductName) &

    NextNext

    SQL-XML con ejemplosEste es el catlogo de productos

    para las categoras 1 y 2

    Ahora puede usar el listado 16.17 como una plantilla para presentar sus propiasconsultas.

    Uso de datos XML desde Transact-SQLEn la seccin precedente aprendimos a obtener datos de SQL Server en formatoXML. En esta seccin aprenderemos a usar datos expresados en XML dentro deSQL Server como parte de cualquier secuencia de comandos, procedimientoalmacenado o desencadenador.

    SQL Server 2000 implementa una nueva funcin OPENXML que lee documentosXML como conjuntos de resultados, de modo que se los puede usar en la clusulaFROM de cualquier instruccin del lenguaje de manipulacin de datos (DML).

    El proceso de lectura de datos XML implica los siguientes pasos:

    1. El proceso recibe el documento XML, por lo general como parmetro de unprocedimiento almacenado o como una cadena almacenada en una tabla.

    2. El proceso llama al procedimiento almacenado extendidosp_xml_preparedocument para crear una representacin en memoria deldocumento XML. SQL Server crea en memoria una estructura en forma derbol que representa el documento XML y devuelve un entero, que actacomo controlador (handle) de la estructura de rbol.

    3. Se usa la funcin OPENXML para leer los datos XML en formato de conjuntode resultados, en cualquier instruccin DML de Transact-SQL, como si setratara de un conjunto de resultados.

    4. Se usa el procedimiento almacenado extendido sp_xml_removedocumentpara destruir la representacin en memoria del documento XML, cuando yano es necesaria.

    32 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 32

  • N O T A

    Ambos procedimientos, sp_xml_preparedocument y sp_xml_removedocument, son procedimientosextendidos que llaman a bibliotecas externas. El hecho de que su nombre comience con sp implicaque estos procedimientos son globales y que se los puede llamar desde cualquier base de datos,sin indicar master como nombre de la base de datos.

    El listado 16.19 contiene un ejemplo que usa el documento XML del listado 16.1.

    Listado 16.19: Uso de la funcin OPENXML para leer un documento XML desde una secuencia de comandos Transact-SQL

    DECLARE @xml varchar(8000)

    -- Este es el documento XML

    SET @xml = SET @xml = @xml + SET @xml = @xml + SET @xml = @xml + SET @xml = @xml +

    -- Creamos una estructura en forma de rbol con el documento XML-- y obtenemos su controlador

    DECLARE @iDoc int

    EXEC sp_xml_preparedocument @iDoc OUTPUT, @xml

    PRINT CHAR(10)+ Se cre el rbol, handle = + CONVERT(varchar(10), @iDoc)+ CHAR(10)

    SELECT *FROM OPENXML(@iDoc, Products, 1)

    EXEC sp_xml_removedocument @idoc

    Se cre el rbol, handle = 13

    id parentid nodetype localname prefix namespaceuri datatype prev text----- -------- -------- ------------ ------ ------------ -------- ---- -----------0.00 NULL 1.00 Products NULL NULL NULL NULL NULL2.00 0.00 1.00 Product NULL NULL NULL NULL NULL3.00 2.00 2.00 ProductID NULL NULL NUL NULL NULL14.00 3.00 3.00 #text NULL NULL NUL NULL 1

    33Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 33

  • Listado 16.19: continuacin

    4.00 2.00 2.00 ProductName NULL NULL NULL NULL NULL15.00 4.00 3.00 #text NULL NULL NULL NULL Chai5.00 2.00 2.00 UnitPrice NULL NULL NULL NULL NULL16.00 5.00 3.00 #text NULL NULL NULL NULL 18.00006.00 0.00 1.00 Product NULL NULL NULL 2.00 NULL7.00 6.00 2.00 ProductID NULL NULL NULL NULL NULL17.00 7.00 3.00 #text NULL NULL NULL NULL 28.00 6.00 2.00 ProductName NULL NULL NULL NULL NULL18.00 8.00 3.00 #text NULL NULL NULL NULL Chang9.00 6.00 2.00 UnitPrice NULL NULL NULL NULL NULL19.00 9.00 3.00 #text NULL NULL NULL NULL 19.000010.00 0.00 1.00 Product NULL NULL NULL 6.00 NULL11.00 10.00 2.00 ProductID NULL NULL NULL NULL NULL20.00 11.00 3.00 #text NULL NULL NULL NULL 312.00 10.00 2.00 ProductName NULL NULL NULL NULL NULL21.00 12.00 3.00 #text NULL NULL NULL NULL Aniseed Syrup13.00 0.00 2.00 UnitPrice NULL NUL NULL NULL NULL22.00 13.00 3.00 #text NULL NULL NULL NULL 10.0000

    (22 filas afectadas)

    La salida del listado 16.19 no es exactamente lo que queramos. Contiene demasiadoscampos y 22 filas. Sin embargo, nuestro documento XML tiene solamente 3productos con 3 campos cada uno. El conjunto de resultados producido recibe elnombre de edge table (tabla irregular) y contiene metadatos que sirven para laconstruccin de sistemas de gestin de documentos XML personalizados.

    Para obtener las filas y columnas deseadas debemos indicar la estructura de latabla con la opcin WITH (vase el listado 16.20). La nica diferencia con el listado16.19 est en la instruccin SELECT.

    Listado 16.20: Uso de la clusula WITH para indicar las columnas deseadas

    DECLARE @xml varchar(8000)

    -- Este es el documento XML

    SET @xml = SET @xml = @xml + SET @xml = @xml + SET @xml = @xml + SET @xml = @xml +

    34 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 34

  • Listado 16.20: continuacin

    -- Creamos una estructura de rbol con el documento XML-- y obtenemos su controlador

    DECLARE @iDoc int

    EXEC sp_xml_preparedocument @iDoc OUTPUT, @xml

    PRINT CHAR(10)+ Se cre el rbol, handle = + CONVERT(varchar(10), @iDoc)+ CHAR(10)

    SELECT *FROM OPENXML(@iDoc, Products/Product, 1)WITH (ProductID int,

    ProductName nvarchar(40),UnitPrice money)

    EXEC sp_xml_removedocument @idoc

    Se cre el rbol, handle = 21

    ProductID ProductName UnitPrice----------- -------------------------- --------------------1.00 Chai $18.002.00 Chang $19.003.00 Aniseed Syrup $10.00

    (3 filas afectadas)

    El resultado del listado 16.20 es ms legible que el del listado 16.19 y es similar acualquier otro conjunto de resultados.

    P R E C A U C I NSi no ejecuta el procedimiento sp_xml_removedocument, la estructura en forma de rbol podrapermanecer en memoria hasta que se reinicie el servidor. Esto puede causar ciertos problemas dememoria tratndose de documentos XML de gran tamao.

    La funcin OOPPEENNXXMMLLEl ejemplo del listado 16.20 es muy sencillo: slo contiene tres elementos de unasola entidad y tres atributos para cada elemento. La funcin OPENXML se puedeusar para leer conjuntos de resultados a partir de documentos XML mucho mscomplejos.

    Considere el documento XML del listado 16.4, que contiene informacinorganizada jerrquicamente proveniente de las tablas Customers, Orders y

    35Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 35

  • Products. Hay diferentes maneras de leer este documento en Transact-SQLmediante la funcin OPENXML. El listado 16.21 muestra algunos ejemplos de cmousar la funcin OPENXML para seleccionar la informacin que se leer de undocumento XML. En este caso podemos ejecutar consultas que extraiganinformacin sobre los pedidos, los clientes, los productos o el detalle de lospedidos, todo desde el mismo documento XML.

    Listado 16.21: Uso de la funcin OPENXML con la clusula WITH para leer un documento XML organizado jerrquicamente

    -- Este es el documento XML

    DECLARE @XML varchar(8000)

    SET @XML =

  • Listado 16.21: continuacin

    Quantity=2/>

    -- Creamos una estructura en forma de rbol con el documento XML-- y obtenemos su controlador

    DECLARE @iDoc int

    EXEC sp_xml_preparedocument @iDoc OUTPUT, @xml

    PRINT CHAR(10)+ Se cre el rbol, handle = + CONVERT(varchar(10), @iDoc)+ CHAR(10)

    PRINT CHAR(10)+ Consulta 1 + CHAR(10)+ Informacin sobre productos+ CHAR(10)

    37Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 37

  • Listado 16.21: continuacin

    SELECT *FROM OPENXML(@iDoc, Customers/Customer/Order/Product, 1)WITH (Name nvarchar(40),

    Price money,Quantity int)

    PRINT CHAR(10)+ Consulta 2 + CHAR(10)+ Informacin sobre pedidos+ CHAR(10)

    SELECT *FROM OPENXML(@iDoc, Customers/Customer/Order, 1)WITH (Date smalldatetime)

    PRINT CHAR(10)+ Consulta 3 + CHAR(10)+ Informacin sobre clientes+ CHAR(10)

    SELECT *FROM OPENXML(@iDoc, Customers/Customer, 1)WITH (CompanyName nvarchar(40))

    PRINT CHAR(10)+ Consulta 4 + CHAR(10)+ Combinacin de atributos de diferentes niveles+ CHAR(10)

    SELECT CompanyName,CONVERT(varchar(10), [Date], 102) As Date,Name, Price, Quantity

    FROM OPENXML(@iDoc, Customers/Customer/Order/Product, 1)WITH (CompanyName nvarchar(40) ../../@CompanyName,

    Date smalldatetime ../@Date,Name nvarchar(40),Price money,Quantity int)

    PRINT CHAR(10)+ Consulta 5 + CHAR(10)+ Ejecucin de una consulta XPath + CHAR(10)+ que extrae en orden los productos cuya cantidad > 20+ CHAR(10)

    SELECT CompanyName,CONVERT(varchar(10), [Date], 102) As Date,

    38 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 38

  • Listado 16.21: continuacin

    Name, Price, QuantityFROM OPENXML(@iDoc, Customers/Customer/Order/Product[@Quantity>20], 1)WITH (CompanyName nvarchar(40) ../../@CompanyName,

    Date smalldatetime ../@Date,Name nvarchar(40),Price money,Quantity int)

    EXEC sp_xml_removedocument @idoc

    Se cre el rbol, handle = 25

    Consulta 1Informacin sobre productos

    Name Price Quantity----------------------------------------- ---------------------- ---------------Gustafaposs Knackebrod $16.80 6.00Ravioli Angelo $15.60 15.00Louisiana Fiery Hot Pepper Sauce $16.80 20.00Filo Mix $5.60 8.00Scottish Longbreads $10.00 10.00Ikura $24.80 20.00Tourtiere $5.90 6.00Uncle Bobaposs Organic Dried Pears $24.00 16.00Spegesild $9.60 20.00Mozzarella di Giovanni $27.80 40.00Ikura $24.80 20.00Uncle Bobaposs Organic Dried Pears $30.00 10.00Steeleye Stout $18.00 30.00Tarte au sucre $49.30 40.00Chang $19.00 20.00Louisiana Fiery Hot Pepper Sauce $21.05 2.00Longlife Tofu $10.00 15.00Queso Cabrales $14.00 12.00Singaporean Hokkien Fried Mee $9.80 10.00Mozzarella di Giovanni $34.80 5.00Flotemysost $17.20 20.00Mozzarella di Giovanni $27.80 7.00Gnocchi di nonna Alice $30.40 4.00Konbu $6.00 4.00Jacks New England Clam Chowder $9.65 12.00Inlagd Sill $19.00 6.00Filo Mix $7.00 18.00

    (27 filas afectadas)

    39Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 39

  • Listado 16.21: continuacin

    Consulta 2Informacin sobre pedidos

    Date-------------------------------------------------------7/8/1996 12:00:00 AM10/21/1996 12:00:00 AM2/19/1997 12:00:00 AM2/27/1997 12:00:00 AM3/18/1997 12:00:00 AM5/23/1997 12:00:00 AM12/31/1997 12:00:00 AM7/4/1996 12:00:00 AM8/6/1996 12:00:00 AM9/2/1996 12:00:00 AM11/11/1997 12:00:00 AM11/12/1997 12:00:00 AM

    (12 filas afectadas)

    Consulta 3Informacin sobre clientes

    CompanyName---------------------------------------Victuailles en stockVins et alcohols Chevalier

    (2 filas afectadas)

    Consulta 4Combinacin de atributos de diferentes niveles

    CompanyName Date Name Price Quantity---------------------- ---------- -------------------------------- ------ ----------Victuailles en stock 1996.07.08 Gustafaposs Knackebrod $16.80 6.00Victuailles en stock 1996.07.08 Ravioli Angelo $15.60 15.00Victuailles en stock 1996.07.08 Louisiana Fiery Hot Pepper $16.80 20.00Victuailles en stock 1996.10.21 Filo Mix $5.60 8.00Victuailles en stock 1996.10.21 Scottish Longbreads $10.00 10.00Victuailles en stock 1997.02.19 Ikura $24.80 20.00Victuailles en stock 1997.02.19 Tourtiere $5.90 6.00Victuailles en stock 1997.02.27 Uncle Bobaposs Organic Dried $24.00 16.00Victuailles en stock 1997.02.27 Spegesild $9.60 20.00Victuailles en stock 1997.02.27 Mozzarella di Giovanni $27.80 40.00

    40 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 40

  • Listado 16.21: continuacin

    Victuailles en stock 1997.03.18 Ikura $24.80 20.00Victuailles en stock 1997.05.23 Uncle Bobaposs Organic Dried $30.00 10.00Victuailles en stock 1997.05.23 Steeleye Stout $18.00 30.00Victuailles en stock 1997.05.23 Tarte au sucre $49.30 40.00Victuailles en stock 1997.12.31 Chang $19.00 20.00Victuailles en stock 1997.12.31 Louisiana Fiery Hot Pepper $21.05 2.00Victuailles en stock 1997.12.31 Longlife Tofu $10.00 15.00Vins et alcohols 1996.07.04 Queso Cabrales $14.00 12.00Vins et alcohols 1996.07.04 Singaporean Hokkien Fried $9.80 10.00Vins et alcohols 1996.07.04 Mozzarella di Giovanni $34.80 5.00Vins et alcohols 1996.08.06 Flotemysost $17.20 20.00Vins et alcohols 1996.08.06 Mozzarella di Giovanni $27.80 7.00Vins et alcohols 1996.09.02 Gnocchi di nonna Alice $30.40 4.00Vins et alcohols 1997.11.11 Konbu $6.00 4.00Vins et alcohols 1997.11.11 Jacks New England Clam $9.65 12.00Vins et alcohols 1997.11.12 Inlagd Sill $19.00 6.00Vins et alcohols 1997.11.12 Filo Mix $7.00 18.00

    (27 filas afectadas)

    Consulta 5Ejecucin de una consulta XPathque extrae en orden los productos cuya cantidad > 20

    CompanyName Date Name Price Quantity---------------------- ---------- -------------------------------- ------ ----------Victuailles en stock 1997.02.27 Mozzarella di Giovanni $27.80 40.00Victuailles en stock 1997.05.23 Steeleye Stout $18.00 30.00Victuailles en stock 1997.05.23 Tarte au sucre $49.30 40.00

    (3 filas afectadas)

    Examinemos ms de cerca los ejemplos del listado 16.21.

    El primer ejemplo usa esta consulta:

    SELECT *

    FROM OPENXML(@iDoc, Customers/Customer/Order/Product, 1)

    WITH (Name nvarchar(40),

    Price money,

    Quantity int)

    Con esta consulta, slo podemos obtener datos en el nivel de los productos, yaque en la funcin OPENXML hemos definido la ruta a los datos comoCustomers/Customer/Order/Product. La clusula WITH contiene los campos

    41Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 41

  • que se leern (de acuerdo al mapping o modo de traduccin de los valores aXML predeterminado).

    Cuando ejecutamos esta consulta obtenemos 27 filas, una por cada productocontenido en el documento XML.

    El segundo ejemplo slo lee la fecha del pedido, que corresponde al nivel de lospedidos (seleccionado por su ruta, Customers/Customer/Order):

    SELECT *

    FROM OPENXML(@iDoc, Customers/Customer/Order, 1)

    WITH (Date smalldatetime)

    El tercer ejemplo slo lee nombres de compaas, del nivel de los clientes(seleccionado mediante su ruta, Customers/Customer).

    SELECT *

    FROM OPENXML(@iDoc, Customers/Customer, 1)

    WITH (CompanyName nvarchar(40))

    Hasta ahora fue bastante sencillo. Seleccionamos la ruta para llegar a los datosque queremos leer (en el segundo parmetro de la funcin OPENXML) e indicamoslas definiciones de las columnas en la clusula WITH.

    El cuarto ejemplo es un poco ms complejo, porque queremos leer algo de informacinde cada uno de los niveles combinando la salida de los tres ejemplos previos:

    SELECT CompanyName,

    CONVERT(varchar(10), [Date], 102) As Date,

    Name, Price, Quantity

    FROM OPENXML(@iDoc, Customers/Customer/Order/Product, 1)

    WITH (CompanyName nvarchar(40) ../../@CompanyName,

    Date smalldatetime ../@Date,

    Name nvarchar(40),

    Price money,

    Quantity int)

    El nivel bsico sigue siendo Product, por eso la ruta esCustomers/Customer/Order/Product. Pero la clusula WITH contiene elcampo Date del nivel Order y el campo CompanyName del nivel Customer.

    Para leer el campo Date, que no pertenece al nivel Product, tenemos que indicarsu ruta ../@Date, que quiere decir subir un nivel y leer el atributo Date.

    Para el campo CompanyName, la ruta es ../../@CompanyName, que quiere decirsubir dos niveles y leer el atributo CompanyName.

    42 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 42

  • El ltimo ejemplo ejecuta una consulta XPath que restringe el conjunto deresultados. En este caso, slo nos interesan los pedidos que contienen ms de 20unidades de cualquier producto dado. Podemos indicar esta condicin en la formade una ruta Customers/Customer/Order/Product[@Quantity>20]:SELECT CompanyName,

    CONVERT(varchar(10), [Date], 102) As Date,

    Name, Price, Quantity

    FROM OPENXML(@iDoc, Customers/Customer/Order/Product[@Quantity>20], 1)

    WITH (CompanyName nvarchar(40) ../../@CompanyName,

    Date smalldatetime ../@Date,

    Name nvarchar(40),

    Price money,

    Quantity int)

    Microsoft SQL Server 2000 implementa un subconjunto de la especificacin deXPath que hace el World Wide Web Consortium (W3C, un consorcio que sededica a la definicin y difusin de estndares para la Web). Puede obtener msinformacin acerca de la especificacin XPath enhttp://www.w3.org/TR/xpath.

    Los libros en pantalla de SQL Server contienen una descripcin completa delsubconjunto implementado en esta versin de SQL Server. Puede buscar laseccin Uso de consultas XPath en los libros en pantalla.

    S U G E R E N C I A

    En el ejemplo del listado 16.21 creamos el documento XML en un campo varchar, que comotal se limita a 8.000 bytes.

    No se pueden crear variables con el tipo de datos ntext, pero un procedimiento almacenadopuede tener un parmetro con ese tipo de datos, lo que aumenta a casi 2 Gigabytes el tamaode los documentos XML que se pueden procesar.

    Es importante que los parmetros que pasen informacin en XML estn definidos como ntexty no text, para poder manejar documentos XML en Unicode.

    Quiz se pregunte qu es el tercer parmetro de la funcin OPENXML. Esteparmetro selecciona el tipo de valores usados en el documento XML:

    0 Por defecto, el mapping (la traduccin de los valores a XML) se basa en eluso de atributos.

    1 Usar mapping basado en atributos.

    2 Usar mapping basado en elementos.

    8 Puede combinar mapping basado en elementos y en atributos.

    43Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 43

  • Como los ejemplos que usamos en el listado 16.21 slo contienen atributos, elvalor del tercer parmetro siempre es 1.

    Combinacin de datos XML con datos de SQL ServerComo la funcin OPENXML devuelve un conjunto de resultados se lo puede combinarcon otras tablas o funciones de conjunto de filas, tales como OPENROWSET,OPENDATASOURCE u OPENQUERY.

    El listado 16.22 muestra un ejemplo en el que combinamos el conjunto deresultados de OPENXML con las tablas Orders y Order Details.

    Listado 16.22: El conjunto de resultados de OPENXML se puede combinar con otras tablas u otros conjuntos de resultados.

    DECLARE @xml varchar(8000)

    -- Este es el documento XML

    SET @xml = SET @xml = @xml + SET @xml = @xml + SET @xml = @xml + SET @xml = @xml +

    -- Creamos una estructura en forma de rbol con el documento XML-- y obtenemos su controlador

    DECLARE @iDoc int

    EXEC sp_xml_preparedocument @iDoc OUTPUT, @xml

    PRINT CHAR(10)+ Se cre el rbol, handle = + CONVERT(varchar(10), @iDoc)+ CHAR(10)

    -- Combinamos el conjunto de resultados de OPENXML-- con las tablas Orders y [Order Details]

    SELECT CONVERT(varchar(10), OrderDate, 102) AS Date,ProductName, P.UnitPrice, OD.QuantityFROM OPENXML(@iDoc, Products/Product, 1)WITH (ProductID int,

    ProductName nvarchar(40),UnitPrice money) AS P

    44 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 44

  • Listado 16.22: continuacin

    JOIN [Order Details] ODON OD.ProductID = P.ProductID

    JOIN Orders OON O.OrderID = OD.OrderID

    WHERE Quantity > 20AND Year(OrderDate) = 1996

    EXEC sp_xml_removedocument @idoc

    Se cre el rbol, handle = 11

    Date ProductName UnitPrice Quantity---------- -------------------------- ---------------------- --------1996.08.20 Chai $18.00 45.001996.10.30 Chang $19.00 24.001996.12.25 Chang $19.00 25.001996.09.05 Chang $19.00 40.001996.10.11 Chang $19.00 25.001996.07.17 Chang $19.00 50.001996.07.24 Chang $19.00 35.001996.08.26 Aniseed Syrup $10.00 30.00

    (8 filas afectadas)

    Acceso a SQL Server 2000 a travs de HTTPCon SQL Server 2000 se puede usar el protocolo HTTP para acceder a losdatos desde cualquier lugar de Internet. Esto es especialmente til cuandohay que cruzar cortafuegos (firewalls), ya que el protocolo HTTP usa elpuerto 80, que no presenta ningn problema cuando se trabaja a travs defirewalls.

    SQL Server puede producir pginas web estticas con el asistente para la Web.Este asistente se puede usar para actualizar la pgina HTML cada vez quecambien los datos subyacentes. Sin embargo, esta forma de publicar en Internetdatos de SQL Server no es muy flexible, ya que se limita a informes especficos.

    Con el filtro de la interfaz de programacin de aplicaciones de IIS para SQL(SQLISAPI) se puede usar Internet Information Server para enviarle consultasa SQL Server y devolverle los resultados al cliente a travs de HTTP.

    El proceso, simplificado, funciona as:

    1. El cliente se conecta a un directorio virtual especial en IIS, definido para elacceso a SQL Server, e indica en la peticin HTTP la consulta que quiereejecutar.

    45Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 45

  • 2. El filtro SQLISAPI enva la peticin a SQL Server a travs de OLE DB,mediante la clusula FOR XML.

    3. SQL Server devuelve los resultados a IIS en formato XML.

    4. IIS devuelve los resultados a la aplicacin cliente a travs de HTTP.

    Hay diferentes formas de enviar peticiones a SQL Server a travs de HTTP:

    Consultas indicadas en el URL: la consulta va insertada en la invocacinmisma del URL. Esta opcin slo se debe usar en situaciones de prueba.

    Archivos de plantilla XML : la consulta se define en archivos preparadosde antemano, lo que brinda un acceso ms seguro que indicar la consultaen el URL.

    Consultas XPath sobre esquemas: para validar consultas que contieneninstrucciones del lenguaje XPath.

    El mtodo POST: se puede usar desde cualquier pgina web.

    Updategrams XML: permiten insertar, modificar o eliminar datos en SQLServer.

    P R E C A U C I NEl envo de consultas o plantillas directamente a travs de HTTP representa un problema deseguridad, ya que mediante este mtodo los usuarios pueden enviar cualquier consultaTransact-SQL vlida (siempre que puedan conectarse al directorio virtual).

    En un entorno de Internet de produccin (destinado al uso real), se recomienda deshabilitar lasconsultas POST y restringir el acceso HTTP exclusivamente al uso de archivos de plantilla, ya quede esta forma es posible limitar las consultas que los usuarios pueden enviar a travs de HTTP.

    N O T APara poder usar updategrams XML en SQL Server 2000, hay que instalar el soporte deXML para SQL Server (XML for SQL Server Web Release), que se puede descargar de:

    http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/msdn-files/027/001/554/msdncompositedoc.xml

    Como alternativa, puede descargar la nueva versin SQ:XML 2.0 de la siguiente direccin:

    http://download.microsoft.com/download/SQLSSVR2000/Install/2.0/W98NT42KMeXP/EN-US/sqlxml.msi

    Pero asegrese de que lee los ficheros que acompaan a esta nueva versin para asegurarse deque mantiene los criterios de compatibilidad con versiones anteriores de esta nueva versin.

    En esta seccin aprenderemos a crear un directorio virtual en IIS para SQL Server ya enviar consultas a travs de HTTP, mediante consultas en URL y plantillas.

    46 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 46

  • Si desea ms informacin acerca de este interesante tema, puede leer la seccinAcceso a SQL Server usando HTTP en los libros en pantalla y la documentacin deXML para SQL que se instala con el soporte de XML para SQL Server 2000 (XMLfor SQL Server Web Release).

    Creacin de un directorio virtual para SQL Server en IISEl primer paso para proveer acceso a SQL Server a travs de HTTP es configurarun directorio virtual en IIS para SQL Server.

    La instalacin de SQL Server 2000 deja en el men de SOL Server un comandollamado Configurar la compatibilidad con SQL XML en IIS. Al presionar en estemen, se inicia la consola administrativa de Microsoft (MMC, MicrosoftManagement Console), con el applet de administracin de directorios virtualespara SQL Server en IIS.

    Seleccione el servidor, expanda su rbol y presione el cursor derecho en el nodo Sitioweb predeterminado, para abrir el men contextual. En el men contextual, elijaNuevo, Directorio virtual para inicial la utilidad de administracin de directoriosvirtuales de IIS. Escriba el nombre del directorio virtual y la ruta fsica, que seencuentran en la ficha General, y ver una imagen similar a la figura 16.9. Paraseguir los ejemplos de esta seccin, el nombre del directorio virtual es SQLXML.

    Figura 16.9: Las propiedades del nuevo directorio virtual.

    47Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 47

  • Abra la ficha Seguridad para indicar el modo de autentificacin de los usuarios.Existen las siguientes opciones:

    Conectarse siempre como, para indicar que todos los accesos a SQL Server atravs de HTTP se realicen a travs de una sola cuenta. Cuando use estaopcin, asegrese de no usar una cuenta que tenga privilegiosadministrativos en SQL Server.

    Usar autentificacin integrada de Windows, que usa el mtodo deautentificacin desafo/respuesta de Microsoft Windows NT (Windows NT4.0) o autentificacin integrada de Windows (Microsoft Windows 2000).

    Usar autentificacin bsica, para que se solicite un nombre de usuario deSQL Server 2000 y una contrasea.

    En este caso, seleccione la opcin Usar autentificacin integrada de Windows. Seencontrar con la situacin presentada en la figura 16.10.

    Figura 16.10: Indicacin del modo de autentificacin usado para acceder a datosde SQL Server a travs de HTTP.

    48 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 48

  • N O T ASi quiere proveer diferentes modos de seguridad para el acceso puede crear diferentes directoriosvirtuales para el mismo servidor. Desde IIS podr administrar la seguridad de acceso de cada unode estos directorios virtuales.

    Abra la ficha Origen de datos para seleccionar el servidor deseado y la base dedatos predeterminada (vase la figura 16.11).

    Figura 16.11: Indicacin de la instancia de SQL Server y la base de datospredeterminada.

    N O T APara acceder a mltiples servidores conviene crear un directorio virtual para cada uno.

    Abra la ficha Configuracin para seleccionar el mtodo de acceso. En este caso,seleccione Permitir consultas en URL, Permitir XPath y Permitir consultas conplantilla (vase la figura 16.12).

    49Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 49

  • Figura 16.12: Configuracin del mtodo de acceso a los datos de SQL Server.

    Para probar el directorio virtual que acaba de configurar abra Internet Explorer yescriba el siguiente URL en la lnea de direccin:http://localhost/sqlxml?sql=SELECT+CategoryName+FROM+Categories+As+Category+FOR+XML+AUTO&root=Categories

    Ver lo que aparece en la figura 16.13.

    N O T A

    En consultas indicadas en URL escriba signos + en vez de los espacios.

    Uso de datos de SQL Server a travs de HTTPEn la seccin precedente aprendimos a configurar un directorio virtual para SQLServer en Internet Information Server. Para probar el directorio virtual enviamosuna consulta sencilla.

    Este directorio virtual se puede usar para enviar todo tipo de consultas a SQLServer. Sin embargo, como podr imaginar, este mtodo puede ser tedioso,aumenta la probabilidad de cometer errores y puede implicar un riesgo deseguridad, ya que en el URL los usuarios pueden enviar cualquier consulta.

    50 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 50

  • Figura 16.13: Resultados de una consulta indicada en URL ejecutada a travs deun directorio virtual para SQL Server en IIS.

    Como alternativa se pueden crear archivos de plantilla XML con consultaspredefinidas. Una plantilla XML es un documento XML que contiene una o msinstrucciones SQL y consultas XPath.

    El lector puede crear ahora mismo su primera plantilla XML. Cree una carpetallamada Plantillas en cualquier lugar del disco rgido del servidor. Abre el blocde notas, crea un nuevo archivo con el nombre Categories.xml y lo guarda en laruta fsica del directorio virtual que cre en la seccin precedente. En este archivoescribe las instrucciones que se incluyen en el listado 16.23.

    Listado 16.23: Una plantilla XML para mostrar categoras

    SELECT CategoryNameFROM Categories AS CategoryFOR XML AUTO

    Ahora inicia la ventana de administracin de directorios virtuales en IIS y abre eldirectorio virtual que cre en la seccin precedente. Va a la ficha Nombresvirtuales y crea un nuevo nombre virtual, llamado Plantillas, que apunte aldirectorio Plantillas que acaba de crear; indica como tipo del directorio virtual laopcin Plantillas. La figura 16.14 muestra la ficha Nombres virtuales luego decrear este nombre virtual.

    51Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 51

  • Figura 16.14: Este directorio virtual contiene un nombre virtual para una plantilla.

    N O T A

    No hace falta que la carpeta para las plantillas coincida con el directorio virtual. Sin embargo,si los archivos de plantilla no estn guardados en una carpeta con nombre virtual de tipoPlantillas, IIS no los reconocer como plantillas XML vlidas.

    Ahora puede abrir Internet Explorer y entrar al siguiente URL:http://localhost/sqlxml/plantillas/Categories.xml

    Ver la familiar lista de categoras en formato XML.

    De esta forma podemos tener consultas predefinidas guardadas como plantillas ylos usuarios no tienen por qu saber cmo estn armadas esas consultas.

    Para hacer algo ms til puede intentar usar parmetros para seleccionarinformacin especfica acerca de los clientes, sus pedidos y los productos incluidosen esos pedidos. Para ello puede escribir las instrucciones que se incluyen en ellistado 16.24 y guardarlas en el archivo CustomersOrders.xml en el directorioPlantillas que cre anteriormente.

    52 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 52

  • Listado 16.24: Una plantilla XML que muestra clientes y sus pedidos

    NULLNULL

    SELECT CompanyName,OrderDate,ProductName,Quantity,Item.UnitPrice

    FROM Customers AS CustomerJOIN Orders AS [Order]

    ON [Order].CustomerID = Customer.CustomerIDJOIN [Order Details] AS Item

    ON Item.OrderID = [Order].OrderIDJOIN Products AS Product

    ON Product.ProductID = Item.ProductIDWHERE CompanyName LIKE

    CASE @CustomerWHEN NULL THEN %ELSE @Customer + %END

    AND ProductName LIKECASE @Product

    WHEN NULL THEN %ELSE @Product + %END

    ORDER BY CompanyName, OrderDate, ProductNameFOR XML AUTO

    Si examina el cdigo del listado 16.24 puede identificar la presencia de una nuevaseccin al principio del archivo:

    NULLNULL

    Esta seccin define los parmetros usados, que funcionan de manera similar a losde los procedimientos almacenados o los de las funciones definidas por el usuario.En este caso hemos declarado dos parmetros: Customer y Product. Para ambos

    53Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 53

  • parmetros declaramos NULL como valor predeterminado. Observe que en estecaso no se trata del valor NULL de SQL, sino de la cadena NULL, que SQL Serverno trata de la misma manera.

    En consecuencia la clusula WHERE aparece diferente:

    WHERE CompanyName LIKE

    CASE @Customer

    WHEN NULL THEN %

    ELSE @Customer + %

    END

    AND ProductName LIKE

    CASE @Product

    WHEN NULL THEN %

    ELSE @Product + %

    END

    Para probar esta plantilla puede escribir este URL en Internet Explorer:http://localhost/sqlxml/Plantillas/CustomersOrders.xml

    Como en este ejemplo no usamos los parmetros, SQL Server devuelve undocumento XML de gran tamao que incluye todos los pedidos hechos por todoslos clientes.

    Para reducir el alcance de la bsqueda escriba los siguientes URL y vea losresultados en Internet Explorer:http://localhost/sqlxml/plantillas/CustomersOrders.xml?Customer=Alfredshttp://localhost/sqlxml/plantillas/CustomersOrders.xml?Customer=Alf&Product=Rahttp://localhost/sqlxml/plantillas/CustomersOrders.xml?Product=Ravioli

    Sin embargo, la forma en que el listado 16.24 enva las consultas no es eficiente.El listado 16.25 muestra una secuencia de instrucciones Transact-SQL que es mslarga pero ms eficiente, ya que SQL Server puede optimizar el uso de los ndicessegn los parmetros enviados. La nica diferencia entre estos dos ejemplos esque el listado 16.25 divide la consulta en cuatro consultas individuales:

    Cuando el usuario no indica ninguno de los parmetros (Product y Customerson ambos NULL) la consulta lee informacin acerca de todos los pedidos.

    Cuando Customer es NULL se lee slo informacin acerca de los pedidosrelacionados con los productos cuyo nombre comienza con el valor indicadoen el parmetro Product.

    54 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 54

  • Cuando Product es NULL se lee slo informacin acerca de los clientes cuyonombre comienza con el valor indicado en el parmetro Customer.

    En el caso restante se lee slo informacin acerca de los productos cuyonombre comienza con el valor indicado en el parmetro Product y clientescuyo nombre comienza con el valor indicado en el parmetro Customer.

    Listado 16.25: Una plantilla XML ms eficiente para mostrar clientes y sus pedidos

    NULLNULL

    IF @Customer = NULLIF @Product = NULL

    SELECT CompanyName,OrderDate,ProductName,Quantity,Item.UnitPrice

    FROM Customers AS CustomerJOIN Orders AS [Order]

    ON [Order].CustomerID = Customer.CustomerIDJOIN [Order Details] AS Item

    ON Item.OrderID = [Order].OrderIDJOIN Products AS Product

    ON Product.ProductID = Item.ProductIDORDER BY CompanyName, OrderDate, ProductNameFOR XML AUTO

    ELSESELECT CompanyName,

    OrderDate,ProductName,Quantity,Item.UnitPrice

    FROM Customers AS CustomerJOIN Orders AS [Order]

    ON [Order].CustomerID = Customer.CustomerIDJOIN [Order Details] AS Item

    ON Item.OrderID = [Order].OrderIDJOIN Products AS Product

    ON Product.ProductID = Item.ProductIDWHERE ProductName LIKE @Product + %

    55Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 55

  • Listado 16.25: continuacin

    ORDER BY CompanyName, OrderDate, ProductNameFOR XML AUTO

    ELSEIF @Product = NULL

    SELECT CompanyName,OrderDate,ProductName,Quantity,Item.UnitPrice

    FROM Customers AS CustomerJOIN Orders AS [Order]

    ON [Order].CustomerID = Customer.CustomerIDJOIN [Order Details] AS Item

    ON Item.OrderID = [Order].OrderIDJOIN Products AS Product

    ON Product.ProductID = Item.ProductIDWHERE CompanyName LIKE @Customer + %ORDER BY CompanyName, OrderDate, ProductNameFOR XML AUTO

    ELSESELECT CompanyName,

    OrderDate,ProductName,Quantity,Item.UnitPrice

    FROM Customers AS CustomerJOIN Orders AS [Order]

    ON [Order].CustomerID = Customer.CustomerIDJOIN [Order Details] AS Item

    ON Item.OrderID = [Order].OrderIDJOIN Products AS Product

    ON Product.ProductID = Item.ProductIDWHERE ProductName LIKE @Product + %AND CompanyName LIKE @Customer + %ORDER BY CompanyName, OrderDate, ProductNameFOR XML AUTO

    Como puede ver en el listado 16.25, en una plantilla no se est limitado a escribiruna sola consulta, sino que puede escribirse un lote completo que incluya variasinstrucciones, siempre que en todas las instrucciones SELECT se use la clusulaFOR XML.

    56 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 56

  • Uso de updategrams para modificar datosen SQL Server 2000

    En las secciones precedentes aprendimos a leer datos de SQL Server en formatoXML y a usar datos XML dentro de un proceso en Transact-SQL.

    La extensin de SQL Server para XML, que como ya hemos explicado se puedebajar de Internet, brinda las siguientes posibilidades adicionales:

    Insertar, eliminar y modificar filas en SQL Server mediante updategramsXML.

    Importar datos XML a SQL Server con el componente para carga masivade XML.

    Un updategram es una plantilla XML que contiene una imagen de los datosprevia y otra imagen posterior.

    Como los documentos XML tienen una estructura jerrquica, los cambios a losdatos pueden afectar mltiples tablas. Los updategrams tienen capacidadestransaccionales que permiten considerar un grupo especfico de cambios comomiembros de la misma transaccin, a fin de mantener la consistencia de los datosa lo largo de esas modificaciones. Cada transaccin se identifica por medio de unelemento sync. El listado 16.26 contiene un sencillo updategram que cambia elnombre de contacto de un cliente.

    Listado 16.26: Un sencillo updategram que cambia el nombre de contacto de un cliente

    Maria Anders

    Stephen Johns

    Use el bloc de notas para crear el ejemplo del listado 16.26 y gurdelo con el nombreCustomerUpdate.xml en el directorio Plantillas que cre con anterioridad (en laseccin Creacin de un directorio virtual para SQL Server en IIS de este captulo).

    Para ejecutar el updategram, abra Internet Explorer y escriba el siguiente URL:http://localhost/sqlxml/plantillas/CustomerUpdate.xml

    57Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 57

  • S U G E R E N C I A

    Si recibe un mensaje de error, controle cmo escribi el archivo XML. Recuerde que las eti-quetas XML distinguen entre maysculas y minsculas.

    Puede abrir una nueva conexin a SQL Server desde el analizador deconsultas y verificar que el cliente ALFKI recibi los cambios definidos enel updategram.

    Si examina el ejemplo del listado 16.26 puede identificar las siguientes secciones:

    Esta lnea, al principio del archivo, define el archivo XML como una plantillaXML que contiene un updategram.

    ...

    Estas dos etiquetas definen los lmites de una transaccin individual.

    ...

    Estas dos etiquetas definen la imagen previa de los datos. En cierto modo,podemos considerar esta seccin como la clusula WHERE de una instruccinUPDATE, en la que definimos qu filas sufrirn las modificaciones.

    ...

    Por ltimo, estas dos etiquetas delimitan los valores a modificar. Esta seccinproduce el mismo efecto que la clusula SET de la instruccin UPDATE.

    En este ejemplo usamos la codificacin (mapping) predeterminada, en la que elcdigo XML muestra los nombres reales de las tablas y las columnas (en este caso,la tabla Customers y las columnas CustomerID y ContactName). En ocasionespuede ser preferible suministrar un archivo de esquema, por ejemploCustomerSchema.xml, en cuyo caso hay que cambiar la lnea delarchivo del updategram y proveer el atributo mapping-schema, como en la lneasiguiente:

    58 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 58

  • N O T A

    Si el esquema no estuviera guardado en la misma ruta que el updategram, en el atributomapping-schema se puede indicar la ruta completa.

    Usando ADO 2.6 se puede invocar un updategram desde una pgina ASP, como enel ejemplo del listado 16.27.

    Listado 16.27: Uso de ADO 2.6 en VBScript para ejecutar un updategram

    SQL-XML by Example - SQLXML.asp

  • Listado 16.27: continuacin

    sConn = sConn & User ID=saadoConn.ConnectionString = sConnadoConn.CursorLocation = adUseClient

    Abrimos la conexin

    adoConn.Open

    Creamos un objeto ADO Command, para enviar la consulta XML y recibir los resultados en XML

    Dim adoCmdSet adoCmd = Server.CreateObject(ADODB.Command)Set adoCmd.ActiveConnection = adoConn

    Definimos un updategram XML como el del listado 16.26 Observe que tenemos que cambiar por porque VBScript usa para delimitar las constantes

    Dim sQuerysQuery = sQuery = sQuery & sQuery = sQuery & sQuery = sQuery & sQuery = sQuery & Maria AnderssQuery = sQuery & sQuery = sQuery & sQuery = sQuery & sQuery = sQuery & sQuery = sQuery & Stephen JohnssQuery = sQuery & sQuery = sQuery & sQuery = sQuery & sQuery = sQuery &

    Creamos y abrimos el objeto Stream

    Dim adoStreamQuerySet adoStreamQuery = Server.CreateObject(ADODB.Stream)adoStreamQuery.Open

    Escribimos la consulta XML dentro del objeto Stream

    adoStreamQuery.WriteText sQuery, adWriteCharadoStreamQuery.Position = 0

    60 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 60

  • Listado 16.27: continuacin

    Seleccionamos el objeto Stream como comando a ejecutar Observe el GUID para la propiedad Dialect, que en este caso representa el formato MSSQLXML

    adoCmd.CommandStream = adoStreamQuery

    Ahora indicaremos que la salida vaya al objeto Response, que tambin es un objeto Stream

    adoCmd.Properties(Output Stream) = Response

    Ya podemos ejecutar el comando con el updategram

    Response.write Ejecutando Updategram... adoCmd.Execute , , adExecuteStreamResponse.write Updategram ejecutado

    %>

    SQL-XML by ExampleEjecucioacute;n de Updategrams

    Como puede ver, el ejemplo del listado 16.27 es bsicamente el mismo que el dellistado 16.17. Las nicas diferencias son el updategram y la ausencia de script decliente, que en este caso no hace falta.

    Uso de updategrams para insertar datos en SQL ServerEn la seccin precedente aprendimos a usar updategrams para modificar datos enSQL Server. Tambin se pueden usar updategrams para insertar datos en SQLServer, siempre que no contengan una seccin .

    El listado 16.28 contiene un updategram que inserta una nueva categora en latabla Categories.

    Listado 16.28: Uso de un updategram para insertar una nueva categora

    61Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 61

  • Listado 16.28: continuacin

    Nueva categ.

    Como puede ver en el listado 16.28, la imagen previa (before) est vaca y laejecucin de este updategram provocar el agregado de una nueva categora con elnombre Nueva categ., y con los valores predeterminados (o NULL) en todos losdems campos.

    La operacin de insercin puede ser ms compleja, por ejemplo, insertar en lamisma operacin una nueva categora y un nuevo producto perteneciente a esacategora. El problema es que el identificador de categora (CategoryID) es unacolumna de identidad y necesitamos usar ese nuevo valor en la tabla Products. Ellistado 16.29 muestra el updategram que lleva a cabo esta accin.

    Listado 16.29: Uso de un updategram para insertar una nueva categora y un nuevo producto perteneciente a esa categora

    Otra categ.

    El ejemplo del listado 16.29 tiene algunos atributos nuevos:

    Esta directiva indica devolver el valor IDENTITY generado automticamente porSQL Server.

    En este caso definimos un nombre de variable (ID) para la columna de identidad.

    Agregamos un nuevo producto mediante CategoryID como el valor de identidadrecin generado y guardado en la variable ID.

    62 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    16 captulo 16 24/1/2002 11:09 Page 62

  • Si ejecuta el updategram como un URL en Internet Explorer recibir la respuestaque aparece en el listado 16.30.

    Listado 16.30: Respuesta recibida luego de insertar una nueva categora y un nuevo producto por medio de un updategram

    - - 11

    El valor 11 corresponde al nuevo valor de identidad usado para la nueva categora.

    Uso de updategrams para eliminar datos en SQL Server 2000En la seccin precedente aprendimos a usar updategrams sin la imagen previa parainsertar nuevas filas en SQL Server. Siguiendo la misma idea, para eliminar filas enSQL Server se pueden usar updategrams que no tengan la imagen posterior (after).

    El listado 16.31 muestra un updategram que elimina los productos y lascategoras insertados en los listados 16.27 y 16.28.

    Listado 16.31: Uso de updategrams para eliminar categoras y productos

    P R E C A U C I NTenga cuidado al definir la imagen before del updategram. Recuerde que es la clusula WHEREde una instruccin DELETE.

    Qu viene ahora?La informacin contenida en este captulo es apenas un elemento ms en el panoramatotal de SQL Server 2000. El lector puede intentar usar muchas de las posibilidades yejemplos de los otros captulos junto con las tcnicas de las que hablamos en este.

    La programacin ASP es un importante componente del desarrollo de aplicacionescon SQL Server y el nuevo paradigma ASP.NET abre nuevos horizontes para estepopular entorno de programacin.

    63Captulo 16: Trabajar con datos XML en SQL Server 2000

    Copyright 2001 PEARSON EDUCATION S.A.

    E J E M P L O

    S A L I D A

    16 captulo 16 24/1/2002 11:09 Page 63

  • Con ADO.NET, el nuevo Visual Studio.NET, el marco .NET en general y lasnuevas capacidades XML, SQL Server abre una ruta en direccin a un panoramams amplio, que incluye la posibilidad de distribuir datos a ms lugares y adiferentes dispositivos, y de interoperar con otros sistemas de base de datos.

    64 Programacin en Microsoft SQL Server 2000 con ejemplos

    Copyright 2001 PEARSON EDUCATION S.A.

    16 captulo 16 24/1/2002 11:09 Page 64