SELECT: cláusula FOR (Transact-SQL)SELECT - FOR Clause (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database noAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Use la cláusula FOR para especificar una de las siguientes opciones para los resultados de la consulta.Use the FOR clause to specify one of the following options for query results.

  • Permita las actualizaciones mientras se visualizan los resultados de la consulta en un cursor del modo de exploración mediante la especificación de FOR BROWSE.Allow updates while viewing query results in a browse mode cursor by specifying FOR BROWSE.

  • Aplique formato XML a los resultados de la consulta mediante la especificación de FOR XML.Format query results as XML by specifying FOR XML.

  • Aplique formato JSON a los resultados de la consulta mediante la especificación de FOR JSON.Format query results as JSON by specifying FOR JSON.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

[ FOR { BROWSE | <XML> | <JSON>} ]  
  
<XML> ::=  
XML   
{   
    { RAW [ ( 'ElementName' ) ] | AUTO }   
    [   
        <CommonDirectivesForXML>   
        [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]   
        [ , ELEMENTS [ XSINIL | ABSENT ]   
    ]  
  | EXPLICIT   
    [   
        <CommonDirectivesForXML>   
        [ , XMLDATA ]   
    ]  
  | PATH [ ( 'ElementName' ) ]   
    [  
        <CommonDirectivesForXML>   
        [ , ELEMENTS [ XSINIL | ABSENT ] ]  
    ]  
}   
  
<CommonDirectivesForXML> ::=   
[ , BINARY BASE64 ]  
[ , TYPE ]  
[ , ROOT [ ( 'RootName' ) ] ]  
  
<JSON> ::=  
JSON   
{   
    { AUTO | PATH }   
    [   
        [ , ROOT [ ( 'RootName' ) ] ]  
        [ , INCLUDE_NULL_VALUES ]  
        [ , WITHOUT_ARRAY_WRAPPER ]  
    ]  
  
}

FOR BROWSEFOR BROWSE

BROWSEBROWSE
Especifica que se permiten las actualizaciones mientras se visualizan los datos en el cursor del modo de exploración de DB-Library.Specifies that updates be allowed while viewing the data in a DB-Library browse mode cursor. 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 ServerSQL Server.A table can be browsed in an application if the table includes a timestamp column, the table has a unique index, and the FOR BROWSE option is at the end of the SELECT statements sent to an instance of SQL ServerSQL Server.

Nota

No se puede usar <lock_hint> HOLDLOCK en una instrucción SELECT que incluya la opción FOR BROWSE.You cannot use the <lock_hint> HOLDLOCK in a SELECT statement that includes the FOR BROWSE option.

FOR BROWSE no puede aparecer en instrucciones SELECT combinadas mediante el operador UNION.FOR BROWSE cannot appear in SELECT statements that are joined by the UNION operator.

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.When the unique index key columns of a table are nullable, and the table is on the inner side of an outer join, the index is not supported by browse mode.

El modo de exploración permite examinar las filas de la tabla de SQL ServerSQL Server y actualizar los datos de la tabla fila por fila.The browse mode lets you scan the rows in your SQL ServerSQL Server table and update the data in your table one row at a time. Para tener acceso a una tabla de SQL ServerSQL Server en una aplicación en el modo de exploración, debe usar una de las dos opciones siguientes:To access a SQL ServerSQL Server table in your application in the browse mode, you must use one of the following two options:

  • La instrucción SELECT que usa para tener acceso a los datos de la tabla de SQL ServerSQL Server debe finalizar con las palabras clave FOR BROWSE.The SELECT statement that you use to access the data from your SQL ServerSQL Server table must end with the keywords FOR BROWSE. Al activar la opción FOR BROWSE para usar el modo de exploración, se crean tablas temporales.When you turn on the FOR BROWSE option to use browse mode, temporary tables are created.

  • Debe ejecutar la instrucción de Transact-SQLTransact-SQL siguiente para activar el modo de exploración mediante la opción NO_BROWSETABLE:You must run the following Transact-SQLTransact-SQL statement to turn on the browse mode by using the NO_BROWSETABLE option:

    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.When you turn on the NO_BROWSETABLE option, all the SELECT statements behave as if the FOR BROWSE option is appended to the statements. Aun así, la opción NO_BROWSETABLE no crea las tablas temporales que la opción FOR BROWSE suele usar para enviar los resultados a la aplicación.However, the NO_BROWSETABLE option does not create the temporary tables that the FOR BROWSE option generally uses to send the results to your application.

Cuando se intenta tener acceso a los datos de las tablas de SQL ServerSQL Server en modo de exploración mediante 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.When you try to access the data from SQL ServerSQL Server tables in browse mode by using a SELECT query that involves an outer join statement, and when a unique index is defined on the table that is present on the inner side of an outer join statement, the browse mode does not support the unique index. El modo de exploración únicamente admite el índice único cuando todas las columnas de clave de índice único pueden aceptar valores NULL.The browse mode supports the unique index only when all the unique index key columns can accept null values. El modo de exploración no admite el índice único si se cumplen las condiciones siguientes:The browse mode does not support the unique index if the following conditions are true:

  • Intenta tener acceso a los datos de las tablas de SQL ServerSQL Server en modo de exploración mediante una consulta SELECT que implica una instrucción de combinación externa.You try to access the data from SQL ServerSQL Server tables in browse mode by using a SELECT query that involves an outer join statement.

  • Un índice único se define en la tabla que está presente en el lado interno de una instrucción de combinación externa.A unique index is defined on the table that is present on the inner side of an outer join statement.

Para reproducir este comportamiento en el modo de exploración, siga estos pasos:To reproduce this behavior in the browse mode, follow these steps:

  1. En SQL Server Management StudioSQL Server Management Studio, cree una base de datos denominada SampleDB.In SQL Server Management StudioSQL Server Management Studio, create a database, named SampleDB.

  2. En la base de datos SampleDB, cree una tabla tleft y una tabla tright que contengan ambas una única columna que se denomine c1.In the SampleDB database, create a tleft table and a tright table that both contain a single column that is named c1. Defina un índice único en la columna c1 de la tabla tleft y establezca la columna para aceptar valores NULL.Define a unique index on the c1 column in the tleft table, and set the column to accept null values. Para ello, ejecute las instrucciones de Transact-SQLTransact-SQL siguientes en una ventana de consulta adecuada:To do this, run the following Transact-SQLTransact-SQL statements in an appropriate query window:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. Inserte varios valores en las tablas tleft y tright.Insert several values in the tleft table and the tright table. Asegúrese de insertar un valor NULL en la tabla tleft.Make sure that you insert a null value in the tleft table. Para ello, ejecute las instrucciones de Transact-SQLTransact-SQL siguientes en la ventana de consulta:To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    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  
    
  4. Active la opción NO_BROWSETABLE.Turn on the NO_BROWSETABLE option. Para ello, ejecute las instrucciones de Transact-SQLTransact-SQL siguientes en la ventana de consulta:To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. Obtenga acceso a los datos de las tablas tleft y tright utilizando una instrucción de combinación externa en la consulta SELECT.Access the data in the tleft table and the tright table by using an outer join statement in the SELECT query. Asegúrese de que la tabla tleft está en el lado interno de la instrucción de combinación externa.Make sure that the tleft table is on the inner side of the outer join statement. Para ello, ejecute las instrucciones de Transact-SQLTransact-SQL siguientes en la ventana de consulta:To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    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:Notice the following output in the Results pane:

    c1c1

    ----

    NULLNULL

    NULLNULL

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 SELECT 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.After you run the SELECT query to access the tables in the browse mode, the result set of the SELECT query contains two null values for the c1 column in the tleft table because of the definition of the right outer join statement. 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.Therefore, in the result set, you cannot distinguish between the null values that came from the table and the null values that the right outer join statement introduced. Puede recibir resultados incorrectos si debe omitir los valores NULL del conjunto de resultados.You might receive incorrect results if you must ignore the null values from the result set.

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.If the columns that are included in the unique index do not accept null values, all the null values in the result set were introduced by the right outer join statement.

FOR XMLFOR XML

XMLXML
Especifica que el resultado de una consulta se devolverá como documento XML.Specifies that the results of a query are to be returned as an XML document. Se debe especificar uno de los siguientes modos XML: RAW, AUTO, EXPLICIT.One of the following XML modes must be specified: RAW, AUTO, EXPLICIT. Para más información sobre los datos XML y SQL ServerSQL Server, vea FOR XML (SQL Server).For more information about XML data and SQL ServerSQL Server, see FOR XML (SQL Server).

RAW [ (" NombreDeElemento ") ]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.Takes the query result and transforms each row in the result set into an XML element with a generic identifier <row /> as the element tag. Opcionalmente, puede especificar un nombre para el elemento de fila.You can optionally specify a name for the row element. La salida XML resultante usa el parámetro ElementName especificado como el elemento de fila generado para cada fila.The resulting XML output uses the specified ElementName as the row element generated for each row. Para obtener más información, vea Usar el modo RAW con FOR XML.For more information, see Use RAW Mode with FOR XML.

AUTOAUTO
Devuelve los resultados de la consulta en un árbol anidado XML sencillo.Returns query results in a simple, nested XML tree. 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.Each table in the FROM clause, for which at least one column is listed in the SELECT clause, is represented as an XML element. A las columnas presentadas en la cláusula SELECT se les asignan los atributos de elemento apropiados.The columns listed in the SELECT clause are mapped to the appropriate element attributes. Para obtener más información, vea Usar el modo AUTO con FOR XML.For more information, see Use AUTO Mode with FOR XML.

EXPLICITEXPLICIT
Especifica que la forma del árbol XML resultante está definida explícitamente.Specifies that the shape of the resulting XML tree is defined explicitly. Con este modo, es necesario escribir las consultas de una cierta manera, de modo que se pueda especificar explícitamente información adicional sobre la anidación deseada.Using this mode, queries must be written in a particular way so that additional information about the desired nesting is specified explicitly. Para obtener más información, vea Usar el modo EXPLICIT con FOR XML.For more information, see Use EXPLICIT Mode with FOR XML.

XMLDATAXMLDATA
Devuelve el esquema XDR insertado, pero no agrega el elemento raíz al resultado.Returns inline XDR schema, but does not add the root element to the result. Si se especifica XMLDATA, el esquema XDR se agrega al documento.If XMLDATA is specified, XDR schema is appended to the document.

Importante

La directiva XMLDATA está en desuso.The XMLDATA directive is deprecated. Utilice la XSD generación en los modos RAW y AUTO.Use XSD generation in the case of RAW and AUTO modes. No hay sustitución para la directiva XMLDATA en modo EXPLICIT.There is no replacement for the XMLDATA directive in EXPLICIT mode. Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL Server.This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

Suprimir los saltos de línea no deseados: es posible que quiera usar SQL Server Management Studio (SSMS) para emitir una consulta en la que se use la cláusula FOR XML.Suppress unwanted line breaks: You might use SQL Server Management Studio (SSMS) to issue a query that uses the FOR XML clause. A veces, se devuelve una gran cantidad de código XML y se muestra en una celda de la cuadrícula.Sometimes a large amount of XML is returned and displayed in one grid cell. La cadena XML podría ser más larga de lo que una celda de cuadrícula de SSMS puede contener en una sola línea.The XML string could be longer than one SSMS grid cell can hold on a single line. En estos casos, es posible que SSMS inserte caracteres de salto de línea entre los segmentos largos de toda la cadena XML.In these cases, SSMS might insert line break characters between long segments of the whole XML string. Esos saltos de línea podrían aparecer en el medio de una subcadena que no se debería dividir entre líneas.Such line breaks might occur in the middle of a substring that should not be split across lines. Puede evitar los saltos de línea mediante una conversión AS XMLDATA.You can prevent the line breaks by using a cast AS XMLDATA. Esta solución también se puede aplicar cuando se usa FOR JSON PATH.This solution can also apply when you use FOR JSON PATH. La técnica se describe en Stack Overflow y se muestra en la siguiente instrucción SELECT de Transact-SQL de ejemplo:The technique is discussed on Stack Overflow, and is shown in the following Transact-SQL sample SELECT statement:

XMLSCHEMA [ (" URI_del_espacio_de_nombres_de_destino ") ]XMLSCHEMA [ ('TargetNameSpaceURI') ]
Devuelve el esquema XSD insertado.Returns inline XSD schema. 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.You can optionally specify a target namespace URI when you specify this directive, which returns the specified namespace in the schema. Para obtener más información, vea Generar un esquema XSD insertado.For more information, see Generate an Inline XSD Schema.

ELEMENTSELEMENTS
Especifica que las columnas se devuelven como subelementos.Specifies that the columns are returned as subelements. Sin embargo, se les asignan atributos XML.Otherwise, they are mapped to XML attributes. Esta opción solo se admite en los modos RAW, AUTO y PATH.This option is supported in RAW, AUTO and PATH modes only. Para obtener más información, vea Usar el modo RAW con FOR XML.For more information, see Use RAW Mode with FOR XML.

XSINILXSINIL
Especifica que se va a crear un elemento con el atributo xsi:nil establecido en True para los valores de columna NULL.Specifies that an element with xsi:nil attribute set to True be created for NULL column values. Esta opción solo se puede especificar con la directiva ELEMENTS.This option can only be specified with ELEMENTS directive. Para obtener más información, vea:For more information, see:

ABSENTABSENT
Indica que para los valores de columna NULL, no se agregarán los elementos XML correspondientes en el resultado XML.Indicates that for null column values, corresponding XML elements will not be added in the XML result. Especifique esta opción solo con ELEMENTS.Specify this option only with ELEMENTS.

PATH [ (" NombreDeElemento ") ]PATH [ ('ElementName') ]
Genera un contenedor del elemento de <row> para cada fila en el conjunto de resultados.Generates a <row> element wrapper for each row in the result set. Opcionalmente, especifique un nombre de elemento para el contenedor del elemento <row>.You can optionally specify an element name for the <row> element wrapper. Si se proporciona una cadena vacía, como FOR XML PATH ( '' ), no se genera un elemento contenedor.If an empty string is provided, such as FOR XML PATH ('') ), a wrapper element is not generated. El uso de PATH puede proporcionar una alternativa más sencilla a consultas escritas con la directiva EXPLICIT.Using PATH may provide a simpler alternative to queries written using the EXPLICIT directive. Para obtener más información, vea Usar el modo PATH con FOR XML.For more information, see Use PATH Mode with FOR XML.

BINARY BASE64BINARY BASE64
Especifica que la consulta devuelve los datos binarios en el formato codificado BINARY BASE64.Specifies that the query returns the binary data in binary base64-encoded format. Al recuperar datos binarios mediante el modo RAW y EXPLICIT, se debe especificar esta opción.When you retrieve binary data by using RAW and EXPLICIT mode, this option must be specified. Éste es el valor predeterminado en el modo AUTO.This is the default in AUTO mode.

TYPETYPE
Especifica que la consulta devuelve un resultado de tipo xml.Specifies that the query returns results as xml type. Para más información, consulte TYPE Directive in FOR XML Queries.For more information, see TYPE Directive in FOR XML Queries.

ROOT [ (" NombreDeLaRaíz ") ]ROOT [ ('RootName') ]
Especifica que se va a agregar un solo elemento de nivel superior al XML resultante.Specifies that a single top-level element be added to the resulting XML. También se puede especificar el nombre del elemento raíz que se generará.You can optionally specify the root element name to generate. Si no se especifica el nombre de raíz opcional, se agrega el elemento <root> predeterminado.If the optional root name is not specified, the default <root> element is added.

Para más información, vea FOR XML (SQL Server).For more info, see FOR XML (SQL Server).

Ejemplo de FOR XMLFOR XML Example

En el siguiente ejemplo se especifica FOR XML AUTO con las opciones TYPE y XMLSCHEMA.The following example specifies FOR XML AUTO with the TYPE and XMLSCHEMA options. Debido a la opción TYPE, el conjunto de resultados que se devuelve al cliente es de tipo xml.Because of the TYPE option, the result set is returned to the client as an xml type. 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.The XMLSCHEMA option specifies that the inline XSD schema is included in the XML data returned, and the ELEMENTS option specifies that the XML result is element-centric.

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;  

FOR JSONFOR JSON

JSONJSON
Especifique FOR JSON para devolver los resultados de una consulta con formato de texto JSON.Specify FOR JSON to return the results of a query formatted as JSON text. También tiene que especificar uno de los siguientes modos JSON: AUTO o PATH.You also have to specify one of the following JSON modes : AUTO or PATH. Para más información sobre la cláusula FOR JSON, vea Dar formato JSON a los resultados de consulta con FOR JSON (SQL Server).For more information about the FOR JSON clause, see Format Query Results as JSON with FOR JSON (SQL Server).

AUTOAUTO
Aplique formato a la salida JSON automáticamente según la estructura de la instrucción SELECT.Format the JSON output automatically based on the structure of the SELECT statement
Para ello, especifique FOR JSON AUTO.by specifying FOR JSON AUTO. Para más información y ejemplos, vea Aplicar formato a la salida JSON automáticamente con el modo AUTO (SQL Server).For more info and examples, see Format JSON Output Automatically with AUTO Mode (SQL Server).

PATHPATH
Para mantener el control total sobre el formato de la salida JSON, especifiqueGet full control over the format of the JSON output by specifying
FOR JSON PATH.FOR JSON PATH. El modoPATH le permite crear objetos contenedores y anidar propiedades complejas.PATH mode lets you create wrapper objects and nest complex properties. Para más información y ejemplos, vea Format Nested JSON Output with PATH Mode (SQL Server) (Aplicar formato a la salida JSON automáticamente con el modo PATH (SQL Server)).For more info and examples, see Format Nested JSON Output with PATH Mode (SQL Server).

INCLUDE_NULL_VALUESINCLUDE_NULL_VALUES
Para incluir valores NULL en la salida JSON, especifique la opción INCLUDE_NULL_VALUES con la cláusula FOR JSON.Include null values in the JSON output by specifying the INCLUDE_NULL_VALUES option with the FOR JSON clause. Si no especifica esta opción, la salida no incluye las propiedades JSON de los valores NULL en los resultados de la consulta.If you don't specify this option, the output does not include JSON properties for null values in the query results. Para más información y ejemplos, vea Inclusión de valores Null en la salida de JSON con la opción INCLUDE_NULL_VALUES (SQL Server).For more info and examples, see Include Null Values in JSON Output with the INCLUDE_NULL_VALUES Option (SQL Server).

ROOT [ (" NombreDeLaRaíz ") ]ROOT [ ('RootName') ]
Para agregar un solo elemento de nivel superior a la salida JSON, especifique la opción ROOT con la cláusula FOR JSON.Add a single, top-level element to the JSON output by specifying the ROOT option with the FOR JSON clause. Si no especifica la opción ROOT , la salida JSON no tiene un elemento raíz.If you don't specify the ROOT option, the JSON output doesn't have a root element. Para más información y ejemplos, vea Agregar un nodo raíz a la salida JSON con la opción ROOT (SQL Server).For more info and examples, see Add a Root Node to JSON Output with the ROOT Option (SQL Server).

WITHOUT_ARRAY_WRAPPERWITHOUT_ARRAY_WRAPPER
Para quitar los corchetes que rodean la salida JSON de manera predeterminada, especifique la opción WITHOUT_ARRAY_WRAPPER con la cláusula FOR JSON.Remove the square brackets that surround the JSON output by default by specifying the WITHOUT_ARRAY_WRAPPER option with the FOR JSON clause. Si no especifica esta opción, la salida JSON aparecerá entre corchetes.If you don't specify this option, the JSON output is enclosed within square brackets. Use la opción WITHOUT_ARRAY_WRAPPER para generar un objeto JSON único como salida.Use the WITHOUT_ARRAY_WRAPPER option to generate a single JSON object as output. Para obtener más información, vea Quitar corchetes de la salida JSON con la opción WITHOUT_ARRAY_WRAPPER (SQL Server).For more info, see Remove Square Brackets from JSON Output with the WITHOUT_ARRAY_WRAPPER Option (SQL Server).

Para obtener más información, vea Format Query Results as JSON with FOR JSON (SQL Server) (Aplicar el formato JSON a los resultados de la consulta con FOR JSON (SQL Server)).For more info, see Format Query Results as JSON with FOR JSON (SQL Server).

Consulte tambiénSee Also

SELECT (Transact-SQL)SELECT (Transact-SQL)