Partilhar via


Cláusula FOR (Transact-SQL)

A cláusula FOR é usada para especificar a opção BROWSE ou XML. BROWSE e XML são opções não relacionadas.

Observação importanteImportante

A diretiva XMLDATA para a opção FOR XML foi preterida. Use geração de XSD no caso dos modos RAW e AUTO. Não há substituição para a diretiva XMLDATA no modo EXPLICIT. Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

[ 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 as atualizações são permitidas ao exibir os dados em um cursor do modo de procura DB-Library. Uma tabela pode ser pesquisada em um aplicativo se a tabela incluir uma coluna timestamp, se tiver um índice exclusivo e a opção FOR BROWSE estiver no final das instruções SELECT enviadas para uma instância do SQL Server.

    ObservaçãoObservação

    Você não pode usar <lock_hint> HOLDLOCK em uma instrução SELECT que inclua a opção FOR BROWSE.

    FOR BROWSE não pode se aparecer em instruções SELECT que sejam unidas pelo operador UNION.

    ObservaçãoObservação

    Quando as colunas de chaves de índice exclusivo de uma tabela permitirem valor nulo e a tabela estiver no lado interno de uma junção externa, o modo de procura não oferece suporte para o índice.

    O modo de busca lhe permite verificar as linhas na tabela do SQL Server e atualizar os dados uma linha de cada vez na tabela. Para acessar uma tabela do SQL Server no seu aplicativo no modo de busca, use uma destas opções:

    • A instrução SELECT utilizada para acessar os dados da tabela SQL Server deve terminar com as palavras-chave FOR BROWSE. Quando você ativa a opção FOR BROWSE para usar o modo de busca, tabelas temporárias são criadas.

    • Você deve executar a seguinte instrução Transact-SQL para ativar o modo de busca usando a opção NO_BROWSETABLE:

      SET NO_BROWSETABLE ON
      

      Quando você ativa a opção NO_BROWSETABLE, todas as instruções SELECT se comportam como se a opção FOR BROWSE estivesse anexada a elas. No entanto, a opção NO_BROWSETABLE não cria as tabelas temporárias que a opção FOR BROWSE geralmente usa para enviar os resultados ao aplicativo.

    Quando você tenta acessar os dados de tabelas do SQL Server no modo de busca utilizando uma consulta SELECT que envolve uma instrução de junção externa e quando um índice exclusivo é definido na tabela presente no interior de uma instrução de junção externa, o modo de busca não dá suporte ao índice exclusivo. O modo de busca somente dá suporte ao índice exclusivo quando todas as colunas de chave do índice exclusivo podem aceitar valores nulos. O modo de busca não dará suporte ao índice exclusivo se as seguintes condições forem verdadeiras:

    • Você tenta acessar os dados de tabelas do SQL Server no modo de busca usando uma consulta SELECT que envolve uma instrução de junção externa.

    • Um índice exclusivo está definido na tabela presente no interior de uma instrução de junção externa.

    Para reproduzir esse comportamento no modo de busca, siga estas etapas:

    1. No SQL Server Management Studio, crie um banco de dados denominado SampleDB.

    2. No banco de dados SampleDB, crie uma tabela tleft e uma tabela tright com uma única coluna denominada c1. Defina um índice exclusivo na coluna c1 na tabela tleft e defina a coluna para aceitar valores nulos. Para fazer isso, execute as seguintes instruções Transact-SQL em uma janela de consulta apropriada:

      CREATE TABLE tleft(c1 INT NULL UNIQUE) ;
      GO 
      CREATE TABLE tright(c1 INT NULL) ;
      GO
      
    3. Insira vários valores nas tabelas tleft e tright. Verifique se você inseriu um valor nulo na tabela tleft. Para fazer isso, execute as seguintes instruções Transact-SQL na janela 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
      
    4. Ative a opção NO_BROWSETABLE. Para fazer isso, execute as seguintes instruções Transact-SQL na janela de consulta:

      SET NO_BROWSETABLE ON ;
      GO
      
    5. Acesse os dados nas tabelas tleft e tright usando uma instrução de junção externa na consulta SELECT. Verifique se a tabela tleft está dentro da instrução de junção externa. Para fazer isso, execute as seguintes instruções Transact-SQL na janela de consulta:

      SELECT tleft.c1 
      FROM tleft 
      RIGHT JOIN tright 
      ON tleft.c1 = tright.c1 
      WHERE tright.c1 <> 2 ;
      

      Observe a seguinte saída no painel de Resultados:

      c1

      ----

      NULL

      NULL

    Depois que você executar a consulta SELECT para acessar as tabelas no modo de busca, o conjunto de resultados da consulta SELECT conterá dois valores nulos da coluna c1 na tabela tleft devido à definição da instrução de junção externa direita. Assim, no conjunto de resultados, não é possível distinguir entre os valores nulos provenientes da tabela e os valores nulos introduzidos pela instrução de junção externa. Talvez você receba resultados incorretos se ignorar os valores nulos do conjunto de resultados.

    ObservaçãoObservação

    Se as colunas incluídas no índice exclusivo não aceitarem valores nulos, todos os valores nulos no conjunto de resultados foram introduzidos pela instrução de junção externa direita.

  • XML
    Especifica que os resultados de uma consulta serão retornados como um documento XML. Um dos seguintes modos XML deve ser especificado: RAW, AUTO, EXPLICIT. Para obter mais informações sobre dados XML e o SQL Server, consulte FOR XML (SQL Server).

  • RAW [ ('ElementName') ]
    Obtém o resultado da consulta e transforma cada linha do conjunto de resultados em um elemento XML com um identificador genérico <row /> como a marca do elemento. Opcionalmente, é possível especificar um nome para o elemento de linha. A saída XML resultante usa o ElementName especificado como o elemento de linha gerado para cada linha. Para obter mais informações, consulte Usar modo RAW com FOR XML e Usar modo RAW com FOR XML.

  • AUTO
    Retorna os resultados da consulta em uma árvore XML simples e aninhada. Cada tabela na cláusula FROM, para a qual pelo menos uma coluna esteja listada na cláusula SELECT, é representada como um elemento XML. As colunas listadas na cláusula SELECT são mapeadas para os atributos apropriados do elemento. Para obter mais informações, consulte Usar o modo AUTO com FOR XML.

  • EXPLICIT
    Especifica que a forma da árvore XML resultante está explicitamente definida. Ao usar este modo, as consultas devem ser gravadas de uma maneira específica para que as informações adicionais sobre o aninhamento desejado sejam especificadas explicitamente. Para obter mais informações, consulte Usar o modo EXPLICIT com FOR XML.

  • XMLDATA
    Retorna o esquema XDR embutido, mas não adiciona o elemento raiz ao resultado. Se XMLDATA for especificado, o esquema XDR será anexado ao documento.

  • XMLSCHEMA [ ('TargetNameSpaceURI') ]
    Retorna o esquema XSD embutido. Opcionalmente, você pode especificar um URI de namespace de destino ao especificar esta diretiva, o que retorna o namespace especificado no esquema. Para obter mais informações, consulte Gerar um esquema XSD embutido.

  • ELEMENTS
    Especifica que as colunas são retornadas como subelementos. Caso contrário, elas serão mapeadas para atributos XML. O suporte a esta opção é oferecido somente nos modos RAW, AUTO e PATH. Para obter mais informações, consulte Usar modo RAW com FOR XML.

  • XSINIL
    Especifica que um elemento com atributo xsi:nil definido como True seja criado para valores de coluna NULL. Esta opção pode ser especificada somente com a diretiva ELEMENTS. Para obter mais informações, consulte Gerar elementos para valores NULL com o parâmetro XSINIL.

  • ABSENT
    Indica que para valores de coluna nulos, os elementos XML correspondentes não serão adicionados ao resultado do XML. Especifique esta opção somente com ELEMENTS.

  • PATH [ ('ElementName') ]
    Gera um wrapper de elemento <row> para cada linha do conjunto de resultados. Opcionalmente, é possível especificar um nome de elemento para o wrapper de elemento <row>. Se uma cadeia de caracteres vazia for fornecida, tal como FOR XML PATH (''), não será grado um elemento wrapper. O uso de PATH pode fornecer uma alternativa mais simples a consultas escritas com o uso da diretiva EXPLICIT. Para obter mais informações, consulte Usar o modo PATH com FOR XML.

  • BINARY BASE64
    Especifica que a consulta retorna os dados binários em formato binário codificado em base64. Ao recuperar dados binários usando o modo RAW e EXPLICIT, esta opção deve ser especificada. Este é o padrão no modo AUTO.

  • TYPE
    Especifica que a consulta retorna resultados como o tipo xml. Para obter mais informações, consulte Diretiva TYPE em consultas FOR XML.

  • ROOT [ ('RootName') ]
    Especifica que um único elemento de nível superior seja adicionado ao XML resultante. Opcionalmente, é possível especificar o nome do elemento raiz a ser gerado. Se o nome raiz opcional não for especificado, o elemento <root> padrão será adicionado.

Exemplos

O exemplo a seguir especifica FOR XML AUTO com as opções TYPE e XMLSCHEMA. Por causa da opção TYPE, o conjunto de resultados é retornado ao cliente como um tipo xml. A opção XMLSCHEMA especifica que o esquema XSD embutido é incluído nos dados XML retornados e a opção ELEMENTS especifica que o resultado XML é centrado em elemento.

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;

Consulte também

Referência

SELECT (Transact-SQL)

FOR XML (SQL Server)