FOR (cláusula de Transact-SQL)
La cláusula FOR se utiliza para especificar la opción BROWSE o XML. BROWSE y XML son opciones no relacionadas.
Importante |
---|
La directiva XMLDATA para la opción FOR XML ha quedado desusada. Utilice la XSD generación en los modos RAW y AUTO. No hay sustitución para la directiva XMLDATA en modo EXPLICIT. Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan. |
Convenciones de sintaxis de Transact-SQL
Sintaxis
[ FOR { BROWSE | <XML> } ]
<XML> ::=
XML
{
{ RAW [ ( 'ElementName' ) ] | AUTO }
[
<CommonDirectives>
[ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]
[ , ELEMENTS [ XSINIL | ABSENT ]
]
| EXPLICIT
[
<CommonDirectives>
[ , XMLDATA ]
]
| PATH [ ( 'ElementName' ) ]
[
<CommonDirectives>
[ , ELEMENTS [ XSINIL | ABSENT ] ]
]
}
<CommonDirectives> ::=
[ , BINARY BASE64 ]
[ , TYPE ]
[ , ROOT [ ( 'RootName' ) ] ]
Argumentos
BROWSE
Especifica que se permiten las actualizaciones mientras se visualizan los datos en el cursor del modo de exploración de DB-Library. Una tabla se puede explorar en una aplicación si la tabla incluye una columna timestamp, la tabla tiene un índice único y la opción FOR BROWSE está al final de las instrucciones SELECT enviadas a una instancia de SQL Server.[!NOTA]
No se puede utilizar <lock_hint> HOLDLOCK en una instrucción SELECT que incluya la opción FOR BROWSE.
FOR BROWSE no puede aparecer en instrucciones SELECT combinadas mediante el operador UNION.
[!NOTA]
Cuando las columnas de clave de índice único de una tabla pueden aceptar valores NULL, y la tabla está en la parte interna de la combinación externa, el índice no se admite en el modo de exploración.
El modo de exploración permite examinar las filas de la tabla de SQL Server y actualizar los datos de la tabla fila por fila. Para tener acceso a una tabla de SQL Server en una aplicación en el modo de exploración, debe utilizar una de las dos opciones siguientes:
La instrucción SELECT que utiliza para tener acceso a los datos de la tabla de SQL Server debe finalizar con las palabras clave FOR BROWSE. Al activar la opción FOR BROWSE para utilizar el modo de exploración, se crean tablas temporales.
Debe ejecutar la instrucción de Transact-SQL siguiente para activar el modo de exploración utilizando la opción NO_BROWSETABLE:
SET NO_BROWSETABLE ON
Al activar la opción NO_BROWSETABLE, todas las instrucciones SELECT se comportan como si la opción FOR BROWSE se anexara a las instrucciones. Sin embargo, la opción NO_BROWSETABLE no crea las tablas temporales que la opción FOR BROWSE utiliza generalmente para enviar los resultados a la aplicación.
Cuando se intenta tener acceso a los datos de las tablas de SQL Server en modo de exploración utilizando una consulta SELECT que implica una instrucción de combinación externa, y cuando se define un índice único en la tabla que está presente en el lado interno de una instrucción de combinación externa, el modo de exploración no admite el índice único. El modo de exploración únicamente admite el índice único cuando todas las columnas de clave de índice único pueden aceptar valores NULL. El modo de exploración no admite el índice único si se cumplen las condiciones siguientes:
Intenta tener acceso a los datos de las tablas de SQL Server en modo de exploración utilizando una consulta SELECT que implica una instrucción de combinación externa.
Un índice único se define en la tabla que está presente en el lado interno de una instrucción de combinación externa.
Para reproducir este comportamiento en el modo de exploración, siga estos pasos:
En SQL Server Management Studio, cree una base de datos denominada SampleDB.
En la base de datos SampleDB, cree una tabla tleft y una tabla tright que contengan ambas una única columna que se denomine c1. Defina un índice único en la columna c1 de la tabla tleft y establezca la columna para aceptar valores NULL. Para ello, ejecute las instrucciones de Transact-SQL siguientes en una ventana de consulta adecuada:
CREATE TABLE tleft(c1 INT NULL UNIQUE) ; GO CREATE TABLE tright(c1 INT NULL) ; GO
Inserte varios valores en las tablas tleft y tright. Asegúrese de insertar un valor NULL en la tabla tleft. Para ello, ejecute las instrucciones de Transact-SQL siguientes en la ventana de consulta:
INSERT INTO tleft VALUES(2) ; INSERT INTO tleft VALUES(NULL) ; INSERT INTO tright VALUES(1) ; INSERT INTO tright VALUES(3) ; INSERT INTO tright VALUES(NULL) ; GO
Active la opción NO_BROWSETABLE. Para ello, ejecute las instrucciones de Transact-SQL siguientes en la ventana de consulta:
SET NO_BROWSETABLE ON ; GO
Obtenga acceso a los datos de las tablas tleft y tright utilizando una instrucción de combinación externa en la consulta SELECT. Asegúrese de que la tabla tleft está en el lado interno de la instrucción de combinación externa. Para ello, ejecute las instrucciones de Transact-SQL siguientes en la ventana de consulta:
SELECT tleft.c1 FROM tleft RIGHT JOIN tright ON tleft.c1 = tright.c1 WHERE tright.c1 <> 2 ;
Observe la salida siguiente en el panel Resultados:
c1
----
NULL
NULL
Después de ejecutar la consulta SELECT para obtener acceso a las tablas en el modo de exploración, el conjunto de resultados de la consulta SELCT contiene dos valores NULL para la columna c1 de la tabla tleft debido a la definición de la instrucción de combinación externa derecha. Por consiguiente, en el conjunto de resultados no puede distinguir entre los valores NULL que procedían de la tabla y los incluidos por la instrucción de combinación externa derecha. Puede recibir resultados incorrectos si debe omitir los valores NULL del conjunto de resultados.
[!NOTA]
Si las columnas que están incluidas en el índice único no aceptan valores NULL, todos los valores NULL en el conjunto de resultados fueron incluidos por la instrucción de combinación externa.
XML
Especifica que el resultado de una consulta se devolverá como documento XML. Debe especificarse uno de los siguientes modos XML: RAW, AUTO, EXPLICIT. Para obtener más información acerca de datos XML y SQL Server, vea FOR XML (SQL Server).RAW [ ('ElementName') ]
Obtiene el resultado de la consulta y transforma cada fila del conjunto de resultados en un elemento XML con un identificador genérico <row /> como etiqueta del elemento. Opcionalmente, puede especificar un nombre para el elemento de fila. La salida XML resultante utiliza el parámetro ElementName especificado como el elemento de fila generado para cada fila. Para obtener más información, vea Usar el modo RAW con FOR XML y Usar el modo RAW con FOR XML.AUTO
Devuelve los resultados de la consulta en un árbol anidado XML sencillo. Cada tabla de la cláusula FROM, para la que al menos se presenta una columna en la cláusula SELECT, se representa como elemento XML. A las columnas presentadas en la cláusula SELECT se les asignan los atributos de elemento apropiados. Para obtener más información, vea Usar el modo AUTO con FOR XML.EXPLICIT
Especifica que la forma del árbol XML resultante está definida explícitamente. Con este modo, es necesario escribir las consultas de una cierta manera, de modo que se pueda especificar explícitamente información adicional acerca de la anidación deseada. Para obtener más información, vea Usar el modo EXPLICIT con FOR XML.XMLDATA
Devuelve el esquema XDR insertado, pero no agrega el elemento raíz al resultado. Si se especifica XMLDATA, el esquema XDR se agrega al documento.XMLSCHEMA [ ('TargetNameSpaceURI') ]
Devuelve el esquema XSD insertado. Opcionalmente puede especificar un URI de espacio de nombres de destino al especificar esta directiva, que devuelve el espacio de nombres especificado en el esquema. Para obtener más información, vea Generar un esquema XSD insertado.ELEMENTS
Especifica que las columnas se devuelven como subelementos. Sin embargo, se les asignan atributos XML. Esta opción solo se admite en los modos RAW, AUTO y PATH. Para obtener más información, vea Usar el modo RAW con FOR XML.XSINIL
Especifica que se va a crear un elemento con el atributo xsi:nil establecido en True para los valores de columna NULL. Esta opción solo se puede especificar con la directiva ELEMENTS. Para obtener más información, vea Generar elementos para valores NULL mediante el parámetro XSINIL.ABSENT
Indica que para los valores de columna NULL, no se agregarán los elementos XML correspondientes en el resultado XML. Especifique esta opción solo con ELEMENTS.PATH [ ('ElementName') ]
Genera un contenedor del elemento de <row> para cada fila en el conjunto de resultados. Opcionalmente, especifique un nombre de elemento para el contenedor del elemento <row>. Si se proporciona una cadena vacía, como FOR XML PATH ('') , no se genera un elemento contenedor. El uso de PATH puede proporcionar una alternativa más sencilla a consultas escritas con la directiva EXPLICIT. Para obtener más información, vea Usar el modo PATH con FOR XML.BINARY BASE64
Especifica que la consulta devuelve los datos binarios en el formato codificado BINARY BASE64. Al recuperar datos binarios mediante el modo RAW y EXPLICIT, se debe especificar esta opción. Éste es el valor predeterminado en el modo AUTO.TYPE
Especifica que la consulta devuelve un resultado de tipo xml. Para obtener más información, vea Directiva TYPE en consultas FOR XML.ROOT [ ('RootName') ]
Especifica que se va a agregar un solo elemento de nivel superior al XML resultante. Opcionalmente puede especificar el nombre del elemento raíz que se va a generar. Si no se especifica el nombre de raíz opcional, se agrega el elemento <root> predeterminado.
Ejemplos
En el siguiente ejemplo se especifica FOR XML AUTO con las opciones TYPE y XMLSCHEMA. Debido a la opción TYPE, el conjunto de resultados que se devuelve al cliente es de tipo xml. La opción XMLSCHEMA especifica que el esquema XSD insertado está incluido en los datos XML devueltos y la opción ELEMENTS especifica que el resultado XML está centrado en elementos.
USE AdventureWorks2012;
GO
SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone
FROM Person.Person AS p
Join Person.PersonPhone AS pph ON p.BusinessEntityID = pph.BusinessEntityID
WHERE LastName LIKE 'G%'
ORDER BY LastName, FirstName
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;