Share via


Introducción a los diagramas de actualización (SQLXML 4.0)

Puede modificar (insertar, actualizar o eliminar) una base de datos de Microsoft SQL Server desde un documento XML existente utilizando un diagrama de actualización o la función OPENXML de Transact-SQL.

La función OPENXML modifica una base de datos dividiendo el documento XML existente y proporcionando un conjunto de filas que puede pasarse a una instrucción INSERT, UPDATE o DELETE. Con OPENXML, las operaciones se realizan directamente en las tablas de la base de datos. Por lo tanto, el uso de OPENXML resulta más adecuado siempre que los proveedores de conjuntos de filas, como una tabla, puedan aparecer como un origen.

Al igual que OPENXML, un diagrama de actualización permite insertar, actualizar o eliminar datos en la base de datos; sin embargo, un diagrama de actualización funciona con las vistas XML proporcionadas por el esquema XSD (o XDR) anotado; por ejemplo, las actualizaciones se aplican a la vista XML proporcionada por el esquema de asignación. El esquema de asignación, a su vez, incluye la información necesaria para asignar elementos y atributos XML a las columnas y tablas de base de datos correspondientes. El diagrama de actualización usa esta información de asignación para actualizar las columnas y tablas de base de datos.

[!NOTA]

En esta documentación se asume que está familiarizado con la compatibilidad de las plantillas y el esquema de asignación de SQL Server. Para obtener más información, vea Introducción a los esquemas XSD anotados (SQLXML 4.0). Para las aplicaciones heredadas que usan XDR, vea Esquemas XDR anotados (obsoletos en SQLXML 4.0).

Espacios de nombres necesarios en el diagrama de actualización

Las palabras clave de un diagrama de actualización, como <sync>, <before> y <after>, existen en el espacio de nombres urn:schemas-microsoft-com:xml-updategram. Se usa un prefijo de espacio de nombres arbitrario. En esta documentación, el prefijo updg denota el espacio de nombres updategram.

Revisar la sintaxis

Un diagrama de actualización es una plantilla con los bloques <sync>, <before> y <after> que forman la sintaxis del diagrama de actualización. El código siguiente muestra esta sintaxis en su forma más simple:

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >
    <updg:before>
        ...
    </updg:before>
    <updg:after>
        ...
    </updg:after>
  </updg:sync>
</ROOT>

Las definiciones siguientes describen la función de cada uno de estos bloques:

  • <before>
    Identifica el estado existente (que también recibe el nombre de "estado before") de la instancia de registro.

  • <after>
    Identifica el nuevo estado al que van a cambiarse los datos.

  • <sync>
    Contiene los bloques <before> y <after>. Un bloque <sync> puede contener más de un conjunto de bloques <before> y <after>. Si hay más de un conjunto de bloques <before> y <after>, estos bloques (aunque estén vacíos) deben especificarse como pares. Además, un diagrama de actualización puede tener más de un bloque <sync>. Cada bloque <sync> es una unidad de transacción (que significa que o bien se hace todo lo que hay en el bloque <sync> o bien no se hace nada). Si especifica varios bloques <sync> en un diagrama de actualización, el error de un bloque <sync> no afecta a los demás bloques <sync>.

El hecho de que un diagrama de actualización elimine, inserte o actualice una instancia de registro depende del contenido de los bloques <before> y <after> :

  • Si una instancia de registro sólo aparece en el bloque <before> sin ninguna instancia correspondiente en el bloque <after>, el diagrama de actualización realiza una operación de eliminación.

  • Si una instancia de registro sólo aparece en el bloque <after> sin ninguna instancia correspondiente en el bloque <before>, se trata de una operación de inserción.

  • Si una instancia de registro aparece en el bloque <before> y tiene una instancia correspondiente en el bloque <after>, se trata de una operación de actualización. En este caso, el diagrama de actualización actualiza la instancia de registro con los valores especificados en el bloque <after>.

Especificar un esquema de asignación en el diagrama de actualización

En un diagrama de actualización, la abstracción XML que se proporciona con un esquema de asignación (se admiten tanto esquemas XSD como esquemas XDR) puede ser implícita o explícita (es decir, un diagrama de actualización puede funcionar con o sin un esquema de asignación especificado). Si no especifica ningún esquema de asignación, el diagrama de actualización asume una asignación implícita (la asignación predeterminada), donde cada elemento del bloque <before> o del bloque <after> se asigna a una tabla y el atributo o elemento secundario de cada elemento se asigna a una columna de la base de datos. Si especifica explícitamente un esquema de asignación, los elementos y atributos del diagrama de actualización deben coincidir con los elementos y los atributos del esquema de asignación.

Asignación implícita (predeterminada)

En la mayoría de los casos, es posible que un diagrama de actualización que realiza actualizaciones simples no requiera un esquema de asignación. En este caso, el diagrama de actualización se basa en el esquema de asignación predeterminado.

En el diagrama de actualización siguiente se muestra una asignación implícita. En este ejemplo, el diagrama de actualización inserta un nuevo cliente en la tabla Sales.Customer. Dado que este diagrama de actualización usa una asignación implícita, el elemento <Sales.Customer> se asigna a la tabla Sales.Customer y los atributos CustomerID y SalesPersonID se asignan a las columnas correspondientes de la tabla Sales.Customer.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
    <Sales.Customer CustomerID="1" SalesPersonID="277" />
    </updg:after>
</updg:sync>
</ROOT>

Asignación explícita

Si especifica un esquema de asignación (ya sea XSD o XDR), el diagrama de actualización usa dicho esquema para determinar las columnas y las tablas de base de datos que van a actualizarse.

Si el diagrama de actualización realiza una actualización compleja (por ejemplo, insertando registros en varias tablas en base a la relación de elementos primarios y secundarios especificada en el esquema de asignación), deberá proporcionar el esquema de asignación de forma explícita mediante el atributo mapping-schema con el que se ejecuta el diagrama de actualización.

Dado que un diagrama de actualización es una plantilla, la ruta de acceso especificada para el esquema de asignación en el diagrama de actualización es relativa a la ubicación del archivo de plantilla (con respecto al lugar donde se almacena el diagrama de actualización). Para obtener más información, vea Cómo especificar un esquema de asignación anotado en un diagrama de actualización (SQLXML 4.0).

Asignación centrada en elementos y centrada en atributos en diagramas de actualización

Con la asignación predeterminada (cuando el esquema de asignación no se especifica en el diagrama de actualización), los elementos del diagrama de actualización se asignan a tablas y los elementos secundarios (en el caso de la asignación centrada en elementos) y los atributos (en el caso de asignación centrada en atributos) se asignan a columnas.

Asignación centrada en elementos

En un diagrama de actualización centrado en elementos, un elemento contiene elementos secundarios que denotan las propiedades del elemento. Como ejemplo, consulte el diagrama de actualización siguiente. El elemento <Person.Contact> contiene los elementos secundarios <FirstName> y <LastName>. Estos elementos secundarios son propiedades del elemento <Person.Contact>.

Dado que este diagrama de actualización no especifica ningún esquema de asignación, el diagrama de actualización usa la asignación implícita, donde el elemento <Person.Contact> se asigna a la tabla Person.Contact y sus elementos secundarios se asignan a las columnas FirstName y LastName.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:after>
    <Person.Contact>
       <FirstName>Catherine</FirstName>
       <LastName>Abel</LastName>
    </Person.Contact>
  </updg:after>
</updg:sync>
</ROOT>

Asignación centrada en atributos

En una asignación centrada en atributos, los elementos tienen atributos. El diagrama de actualización siguiente usa la asignación centrada en atributos. En este ejemplo, el elemento <Person.Contact> consta de los atributos FirstName y LastName. Estos atributos son las propiedades del elemento <Person.Contact>. Como en el ejemplo anterior, este diagrama de actualización no especifica ningún esquema de asignación, de modo que se basa en la asignación implícita para asignar el elemento <Person.Contact> a la tabla Person.Contact y los atributos del elemento a las columnas respectivas de la tabla.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Contact FirstName="Catherine" LastName="Abel" />
  </updg:after>
</updg:sync>
</ROOT>

Usar asignaciones centradas en elementos y centradas en atributos

Puede especificar una combinación de asignaciones centradas en elementos y asignaciones centradas en atributos, tal y como se muestra en el diagrama de actualización siguiente. Tenga en cuenta que el elemento <Person.Contact> contiene tanto un atributo como un elemento secundario. Asimismo, este diagrama de actualización se basa en la asignación implícita. De este modo, el atributo FirstName y el elemento secundario <LastName> se asignan a las columnas correspondientes de la tabla Person.Contact.

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
  <updg:before>
  </updg:before>
  <updg:after>
    <Person.Contact FirstName="Catherine" >
       <LastName>Abel</LastName>
    </Person.Contact>
  </updg:after>
</updg:sync>
</ROOT>

Trabajar con caracteres que son válidos en SQL Server pero que no son válidos en XML

En SQL Server, los nombres de tabla pueden incluir un espacio. Sin embargo, este tipo de nombre de tabla no es válido en XML.

Para codificar los caracteres que son identificadores SQL Server válidos pero no identificadores XML válidos, use '__xHHHH__' como valor de codificación, donde HHHH representa el código UCS 2 hexadecimal de cuatro dígitos correspondiente al carácter que ocupa el primer lugar en función del bit más significativo. Con este esquema de codificación, un carácter de espacio se reemplaza por x0020 (el código hexadecimal de cuatro dígitos de un carácter de espacio); así, el nombre de tabla [Order Details] en SQL Server se convierte en _x005B_Order_x0020_Details_x005D_ en XML.

De igual forma, podría tener que especificar nombres de elemento de tres partes, como <[base de datos].[propietario].[tabla]>. Dado que los caracteres de corchetes ([ y ]) no son válidos en XML, debe especificar este nombre como <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>, donde _x005B_ es la codificación del corchete izquierdo ([) y _x005D_ es la codificación del corchete derecho (]).

Ejecutar diagramas de actualización

Dado que un diagrama de actualización es una plantilla, todos los mecanismos de procesamiento de una plantilla se aplican al diagrama de actualización. Para SQLXML 4.0, puede ejecutar un diagrama de actualización de cualquiera de las siguientes formas:

  • Enviándolo en un comando ADO.

  • Enviándolo como un comando OLE DB.