Compartilhar via


Diretiva TYPE em consultas FOR XML

No SQL Server 2000, o resultado de uma consulta FOR XML sempre é retornado diretamente ao cliente em formulário textual. A partir do SQL Server 2005, o suporte do SQL Server para o tipo de dados xml permite solicitar opcionalmente que o resultado de uma consulta FOR XML seja retornado como tipo de dados xml especificando a diretiva TYPE. Isso permite processar o resultado de uma consulta FOR XML no servidor. Por exemplo, é possível especificar um XQuery em relação a ela, atribuir o resultado a uma variável de tipo xml ou gravar consultas FOR XML aninhadas.

ObservaçãoObservação

O SQL Server retorna dados da instância de tipo de dados XML ao cliente como um resultado das diferentes construções pelo servidor como consultas FOR XML que usam a diretiva TYPE ou onde o tipo de dados xml é usado para retornar valores de dados da instância XML das colunas da tabela e dos parâmetros de saída SQL. No código do aplicativo cliente, o provedor ADO.NET solicita que essas informações de tipo de dados sejam enviadas em uma codificação binária do servidor. Porém, se você estiver usando FOR XML sem a diretiva TYPE, os dados XML retornarão como um tipo de cadeia de caracteres. De qualquer forma, o provedor cliente sempre poderá controlar qualquer formulário de XML. Observe que FOR XML de nível superior sem a diretiva TYPE não pode ser usado com cursores.

Exemplos

Os exemplos a seguir ilustram o uso da diretiva TYPE com consultas FOR XML.

Recuperando resultados de consultas FOR XML como tipo xml

A consulta a seguir recupera informações de contato de clientes da tabela Contacts. Como a diretiva TYPE está especificada em FOR XML, o resultado é retornado como tipo xml.

SELECT ContactID, FirstName, LastName, Phone
FROM Person.Contact
ORDER BY ContactID
FOR XML AUTO, TYPE

Este é o resultado parcial:

<Contact ContactID="1" FirstName="Syed" LastName="Abbas" 
         Phone="398-555-0132"/>
<Contact ContactID="2" FirstName="Catherine" LastName="Abel" 
         Phone="747-555-0171"/>
...

Atribuindo resultados de consultas FOR XML a uma variável de tipo xml

No exemplo a seguir, um resultado de FOR XML é atribuído a uma variável de tipo xml, @x. A consulta recupera informações de contato, como o ContactID, FirstName, LastName e números de telefones adicionais, da coluna AdditionalContactInfo de TIPO xml . Como a cláusula FOR XML especifica a diretiva TYPE, o XML é retornado como tipo xml e é atribuído a uma variável.

DECLARE @x XML
SET @x = (
   SELECT ContactID, 
          FirstName, 
          LastName, 
          AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
              //act:telephoneNumber/act:number') as MorePhoneNumbers
   FROM Person.Contact
   FOR XML AUTO, TYPE)
SELECT @x
GO

Consultando resultados de uma consulta FOR XML

As consultas FOR XML retornam XML. Portanto é possível aplicar métodos de tipo xml, como query() e value(), ao resultado XML retornado por consultas FOR XML.

Na consulta a seguir, o método query() do tipo de dados xml é usado para consultar o resultado da consulta FOR XML. Para obter mais informações, consulte Método consulta() (Tipo de dados xml).

SELECT (SELECT ContactID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
 //act:telephoneNumber/act:number
') as PhoneNumbers
FROM Person.Contact
FOR XML AUTO, TYPE).query('/Person.Contact[1]')

A consulta interna SELECT … FOR XML retorna um resultado de tipo xml ao qual o SELECT externo aplica o método query() ao tipo xml. Observe a diretiva TYPE especificada.

Este é o resultado:

<Person.Contact ContactID="1" FirstName="Gustavo" LastName="Achong">
  <PhoneNumbers>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">111-111-1111</act:number>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">112-111-1111</act:number>
  </PhoneNumbers>
</Person.Contact>

Na consulta a seguir, o método value() do tipo de dados xml é usado para recuperar um valor do resultado XML retornado pela consulta SELECT…FOR XML. Para obter mais informações, consulte Método de valor() (Tipo de dados xml).

declare @FirstPhoneFromAdditionalContactInfo varchar(40);
SELECT @FirstPhoneFromAdditionalContactInfo = 
 ( SELECT ContactID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";

   //act:telephoneNumber/act:number
   ') as PhoneNumbers
   FROM Person.Contact Contact
   FOR XML AUTO, TYPE).value('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
  /Contact[@ContactID="1"][1]/PhoneNumbers[1]/act:number[1]', 'varchar(40)'
 )
select @FirstPhoneFromAdditionalContactInfo

A expressão de caminho XQuery no método value() recupera o primeiro número de telefone de contato de um cliente cujo ContactID é 1.

ObservaçãoObservação

Se a diretiva TYPE não estiver especificada, o resultado da consulta FOR XML será retornado como tipo nvarchar(max).

Usando resultados de consulta FOR XML em INSERT, UPDATE e DELETE (DML do Transact-SQL)

O exemplo a seguir demonstra como consultas FOR XML podem ser usadas em instruções DML (linguagem de manipulação de dados). No exemplo, o FOR XML retorna uma instância de tipo xml. A instrução INSERT insere esse XML em uma tabela.

CREATE TABLE T1(intCol int, XmlCol xml)
go
INSERT INTO T1 
VALUES(1, '<Root><ProductDescription ProductModelID="1" /></Root>')
go

CREATE TABLE T2(XmlCol xml)
go
INSERT INTO T2(XmlCol) 
SELECT (SELECT XmlCol.query('/Root') 
        FROM T1 
        FOR XML AUTO,TYPE) 
go

Consulte também

Referência