Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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"/>