Compartir a través de


Especificar metapropiedades en OPENXML

Los atributos de metapropiedad de un documento XML son atributos que describen las propiedades de un elemento XML, como elemento, atributo o cualquier otro nodo DOM. Estos atributos no existen físicamente en el texto del documento XML. Sin embargo, OPENXML proporciona estas metapropiedades para todos los elementos XML. Estas metapropiedades permiten extraer información, como el posicionamiento local y la información del espacio de nombres, de nodos XML. Esta información proporciona más detalles de los que se muestran en la representación textual.

Puede asignar estas metapropiedades a las columnas del conjunto de filas de una instrucción OPENXML mediante el parámetro ColPattern . Las columnas contendrán los valores de las metapropiedades a las que se asignan. Para obtener más información sobre la sintaxis de OPENXML, vea OPENXML (Transact-SQL).

Para acceder a los atributos de metapropiedad, se proporciona un espacio de nombres específico de SQL Server. Este espacio de nombres urn:schemas-microsoft-com:xml-metaprop permite al usuario acceder a los atributos de metapropiedad. Si el resultado de una consulta OPENXML se devuelve en un formato de tabla perimetral, la tabla perimetral contiene una columna para cada atributo de metapropiedad, excepto la metapropiedad xmltext .

Algunos de los atributos de metapropiedad se usan con fines de procesamiento. Por ejemplo, el atributo de metapropiedad xmltext se usa para el control de desbordamiento. El control de desbordamiento hace referencia a los datos sin enumerar y sin procesar del documento. Una de las columnas del conjunto de filas generado por OPENXML se puede identificar como la columna de desbordamiento. Para ello, debe asignarlo a la metapropiedad xmltext mediante el parámetro ColPattern . A continuación, la columna recibe los datos de desbordamiento. El parámetro flags determina si la columna contiene todo o solo los datos sin enumerar.

En la tabla siguiente se enumeran los atributos de metapropiedad que posee cada elemento XML analizado. Se puede acceder a estos atributos de metapropiedad mediante el uso del espacio de nombres urn:schemas-microsoft-com:xml-metaprop. Se omite cualquier valor que el usuario establezca directamente en el documento XML mediante estas metapropiedades.

Nota:

No se puede hacer referencia a estas metapropiedades en ninguna navegación XPath.

Atributo Metaproperty Descripción
@mp:id Proporciona un identificador en todo el documento generado por el sistema del nodo DOM. Siempre que el documento no se vuelva a analizar, este identificador hace referencia al mismo nodo XML.

Un identificador XML de 0 indica que el elemento es un elemento raíz. Su identificador XML primario es NULL.
@mp:localname Almacena la parte local del nombre del nodo. Se usa con un prefijo y un URI de espacio de nombres para asignar un nombre a los nodos de elemento o atributo.
@mp:namespaceuri Proporciona el URI del espacio de nombres del elemento actual. Si el valor de este atributo es NULL, no hay ningún espacio de nombres presente.
@mp:prefijo Almacena el prefijo de espacio de nombres del nombre del elemento actual.

Si no hay ningún prefijo (NULL) y se proporciona un URI, indica que el espacio de nombres especificado es el espacio de nombres predeterminado. Si no se da ningún URI, no se adjunta ningún espacio de nombres.
@mp:prev Almacena el elemento relacionado anterior en relación con un nodo. Esto proporciona información sobre el orden de los elementos del documento.

@mp:prev contiene el identificador XML del elemento relacionado anterior que tiene el mismo elemento primario. Si un elemento está al principio de la lista de elementos del mismo nivel, @mp:prev es NULL.
@mp:xmltext Se usa para fines de procesamiento. Es la serialización textual del elemento y sus atributos, así como los subelementos, como se usa en el control de desbordamiento de OPENXML.

En esta tabla se muestran las propiedades primarias adicionales que se proporcionan y que permiten recuperar información sobre la jerarquía.

Atributo de metapropiedad primario Descripción
@mp:parentid Corresponde a .. /@mp:id
@mp:parentlocalname Corresponde a .. /@mp:localname
@mp:parentnamespacerui Corresponde a .. /@mp:namespaceuri
@mp:parentprefix Corresponde a .. /@mp:prefix

Ejemplos

En los ejemplos siguientes se muestra cómo se usa OPENXML para crear diferentes vistas de conjunto de filas.

A. Asignación de las columnas del conjunto de filas OPENXML a las metapropiedades

En este ejemplo se usa OPENXML para crear una vista de conjunto de filas del documento XML de ejemplo. En concreto, muestra cómo se pueden asignar los distintos atributos de metapropiedad a columnas de conjunto de filas en una instrucción OPENXML mediante el parámetro ColPattern .

La instrucción OPENXML ilustra lo siguiente:

  • La columna id se asigna al atributo metaproperty @mp:id e indica que la columna contiene el identificador XML único generado por el sistema del elemento.

  • La columna primaria se asigna a @mp:parentid e indica que la columna contiene el identificador XML del elemento primario del elemento.

  • La columna parentLocalName se asigna a @mp:parentlocalname e indica que la columna contiene el nombre local del elemento primario.

A continuación, la instrucción SELECT devuelve el conjunto de filas proporcionado por OPENXML:

DECLARE @idoc int  
DECLARE @doc nvarchar(1000)  
-- Sample XML document  
SET @doc = N'<root>  
  <Customer cid= "C1" name="Janine" city="Issaquah">  
      <Order oid="O1" date="1/20/1996" amount="3.5" />  
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>  
   </Customer>  
   <Customer cid="C2" name="Ursula" city="Oelde" >  
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">  
          <Urgency>Important</Urgency>  
      </Order>  
      <Order oid="O4" date="1/20/1996" amount="10000"/>  
   </Customer>  
</root>'  
-- Create an internal representation of the XML document.  
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc  
  
-- Execute a SELECT statement using OPENXML rowset provider.  
SELECT *  
FROM OPENXML (@idoc, '/root/Customer/Order', 9)  
      WITH (id int '@mp:id',   
            oid char(5),   
            date datetime,   
            amount real,   
            parentIDNo int '@mp:parentid',   
            parentLocalName varchar(40) '@mp:parentlocalname')  
EXEC sp_xml_removedocument @idoc  

El resultado es el siguiente:

id   oid         date                amount    parentIDNo  parentLocalName    
--- ------- ---------------------- ---------- ------------ ---------------  
6    O1    1996-01-20 00:00:00.000     3.5         2        Customer  
10   O2    1997-04-30 00:00:00.000     13.4        2        Customer  
19   O3    1999-07-14 00:00:00.000     100.0       15       Customer  
25   O4    1996-01-20 00:00:00.000     10000.0     15       Customer  

B. Recuperación del documento XML completo

En este ejemplo, OPENXML se usa para crear una vista de conjunto de filas de una columna del documento XML de ejemplo. Esta columna, Col1, se asigna a la metapropiedad xmltext y se convierte en una columna de desbordamiento. Como resultado, la columna recibe los datos sin consumir. En este caso, es todo el documento.

A continuación, la instrucción SELECT devuelve el conjunto de filas completo.

DECLARE @idoc int  
DECLARE @doc nvarchar(1000)  
SET @doc = N'<?xml version="1.0"?>  
<root>  
  <Customer cid= "C1" name="Janine" city="Issaquah">  
      <Order oid="O1" date="1/20/1996" amount="3.5" />  
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very   
             satisfied</Order>  
   </Customer>  
   <Customer cid="C2" name="Ursula" city="Oelde" >  
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue   
             white red">  
     <MyTag>Testing to see if all the subelements are returned</MyTag>  
          <Urgency>Important</Urgency>  
      </Order>  
      <Order oid="O4" date="1/20/1996" amount="10000"/>  
   </Customer>  
</root>'  
-- Create an internal representation of the XML document.  
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc  
  
-- Execute a SELECT statement using OPENXML rowset provider.  
SELECT *  
FROM OPENXML (@idoc, '/')  
   WITH (Col1 ntext '@mp:xmltext')  

Para recuperar todo el documento sin la declaración XML, la consulta se puede especificar como se muestra en lo siguiente:

SELECT *  
FROM OPENXML (@idoc, '/root')  
   WITH (Col1 ntext '@mp:xmltext')  
EXEC sp_xml_removedocument @idoc  

La consulta devuelve el elemento raíz que tiene el nombre raíz y los datos que contiene el elemento raíz.

C. Especificar la metapropiedad xmltext para recuperar los datos no consumidos en una columna

En este ejemplo se usa OPENXML para crear una vista de conjunto de filas del documento XML de ejemplo. En el ejemplo se muestra cómo recuperar los datos XML no consumidos mediante la asignación del atributo de metapropiedad xmltext a una columna de conjunto de filas en OPENXML.

La columna comment se identifica como la columna de desbordamiento al asignarla a la metapropiedad @mp:xmltext . El parámetro flags se establece en 9 (XML_ATTRIBUTE y XML_NOCOPY). Esto indica una asignación centrada en atributos y señala que solo los datos no consumidos deben copiarse en la columna de desbordamiento.

A continuación, la instrucción SELECT devuelve el conjunto de filas proporcionado por OPENXML.

En este ejemplo, la metapropiedad @mp:parentlocalname se establece para una columna , ParentLocalName, en el conjunto de filas generado por OPENXML. Como resultado, esta columna contiene el nombre local del elemento primario.

Se especifican dos columnas adicionales en el conjunto de filas, parent y comment. La columna primaria se asigna a @mp:parentid e indica que la columna contiene el identificador XML del elemento primario del elemento. La columna de comentarios se identifica como la columna de desbordamiento mediante la asignación a la metapropiedad @mp:xmltext .

DECLARE @idoc int  
DECLARE @doc nvarchar(1000)  
-- sample XML document  
SET @doc = N'<root>  
  <Customer cid= "C1" name="Janine" city="Issaquah">  
      <Order oid="O1" date="1/20/1996" amount="3.5" />  
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>  
   </Customer>  
   <Customer cid="C2" name="Ursula" city="Oelde" >  
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">  
          <Urgency>Important</Urgency>  
      </Order>  
      <Order oid="O4" date="1/20/1996" amount="10000"/>  
   </Customer>  
</root>  
'  
-- Create an internal representation of the XML document.  
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc  
  
-- Execute a SELECT statement using OPENXML rowset provider.  
SELECT *  
FROM OPENXML (@idoc, '/root/Customer/Order', 9)  
      WITH (oid char(5),   
            date datetime,  
            comment ntext '@mp:xmltext')  
EXEC sp_xml_removedocument @idoc  

Éste es el resultado. Dado que las columnas oid y las de fecha ya se han consumido, no se muestran en la columna de desbordamiento.

oid   date                        comment                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
----- --------------------------- ----------------------------------------  
O1    1996-01-20 00:00:00.000     <Order amount="3.5"/>  
O2    1997-04-30 00:00:00.000     <Order amount="13.4">Customer was very   
                                   satisfied</Order>  
O3    1999-07-14 00:00:00.000     <Order amount="100" note="Wrap it blue   
                                   white red"><Urgency>   
                                   Important</Urgency></Order>  
O4    1996-01-20 00:00:00.000     <Order amount="10000"/>  

Véase también

OPENXML (Transact-SQL)
OPENXML (SQL Server)