Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
O suporte do SQL Server para o tipo de dados xml (Transact-SQL) permite que você solicite opcionalmente que o resultado de uma consulta FOR XML seja retornado como xml especificando a diretiva TYPE. Isso permite que você processe o resultado de uma consulta FOR XML no servidor. Por exemplo, você pode especificar um XQuery em relação a ele, atribuir o resultado a uma variável de tipo de xml ou escrever consultas FOR XML aninhadas.
Observação
O SQL Server retorna dados de instância do tipo de dados xml para o cliente como resultado de diferentes construções do servidor, como consultas FOR XML que usam a diretiva TYPE, ou onde o tipo de dados xml é usado para retornar valores de dados de instância XML de colunas de tabelas SQL e parâmetros de saída. No código do aplicativo cliente, o provedor de ADO.NET solicita que essas informações de tipo de dados xml sejam enviadas em uma codificação binária do servidor. No entanto, se você estiver usando FOR XML sem a diretiva TYPE, os dados XML retornarão como um tipo de cadeia de caracteres. Em qualquer caso, o provedor do cliente sempre será capaz de lidar com qualquer forma de XML. Observe que o nível superior FOR XML 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 consulta FOR XML como tipo XML
A consulta a seguir recupera informações de contato do cliente da tabela Contacts. Como a diretiva TYPE é especificada em FOR XML, o resultado é retornado como tipo de xml.
USE AdventureWorks2022;
Go
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
ORDER BY BusinessEntityID
FOR XML AUTO, TYPE;
Este é o resultado parcial:
<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>
<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>
...
Atribuindo resultados de consulta FOR XML a uma variável de tipo xml
No exemplo a seguir, um resultado FOR XML é atribuído a uma variável do tipo xml , @x. A consulta recupera informações de contato, como BusinessEntityID, FirstName, LastNamee números de telefone adicionais, da coluna AdditionalContactInfo de TYPExml. Como a cláusula FOR XML especifica a diretiva TYPE, o XML é retornado como tipo de XML e é atribuído a uma variável.
USE AdventureWorks2022;
GO
DECLARE @x xml;
SET @x = (
SELECT BusinessEntityID,
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.Person
FOR XML AUTO, TYPE);
SELECT @x;
GO
Consultando resultados de uma consulta FOR XML
As consultas FOR XML retornam XML. Portanto, você pode aplicar métodos de tipo de 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 query() (xml Data Type).
USE AdventureWorks2022;
GO
SELECT (SELECT BusinessEntityID, 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.Person
FOR XML AUTO, TYPE).query('/Person.Person[1]');
A consulta interna SELECT ... FOR XML retorna um resultado do tipo xml , ao qual a parte externa SELECT aplica o método query() ao tipo xml . Observe a diretiva TYPE especificada.
Este é o resultado:
<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez">
<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.Person>
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 value() (xml Data Type).
USE AdventureWorks2022;
GO
DECLARE @FirstPhoneFromAdditionalContactInfo varchar(40);
SELECT @FirstPhoneFromAdditionalContactInfo =
( SELECT BusinessEntityID, 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.Person Contact
FOR XML AUTO, TYPE).value('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
/Contact[@BusinessEntityID="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 um contacto de cliente para o qual o BusinessEntityID é 1.
Observação
Se a diretiva TYPE não for especificada, o resultado da consulta FOR XML será retornado como tipo nvarchar(max).
O uso da consulta FOR XML resulta em INSERT, UPDATE e DELETE (Transact-SQL DML)
O exemplo a seguir demonstra como consultas FOR XML podem ser usadas em instruções DML (Data Manipulation Language). 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