Published on

January 22, 2012

Compreendendo a cláusula WITH RESULT SETS no SQL Server

Não é incomum ter procedimentos armazenados que retornam conjuntos de resultados, e embora pareça uma boa ideia, isso se torna um problema quando você deseja ter controle sobre o nome das colunas e o tipo de dados das colunas que estão sendo retornadas como parte do conjunto de resultados. O SQL Server 2012 introduz um novo recurso chamado WITH RESULT SETS, que permite redefinir o nome e os tipos de dados das colunas que estão sendo retornadas pelo procedimento armazenado.

Compreendendo a cláusula WITH RESULT SETS

A cláusula WITH RESULT SETS pode ser usada com a instrução EXECUTE no SQL Server 2012 para redefinir o nome e os tipos de dados das colunas que estão sendo retornadas por um procedimento armazenado. Esse recurso é útil quando você deseja inserir os registros de um conjunto de resultados em uma tabela temporária com nomes de colunas e tipos de dados específicos, sem depender do que está sendo retornado pelo procedimento armazenado.

A cláusula WITH RESULT SETS também pode ser usada com um procedimento armazenado que retorna vários conjuntos de resultados. Para cada conjunto de resultados, você pode definir os nomes das colunas e os tipos de dados separadamente.

Observe que às vezes você pode querer restringir um procedimento armazenado de retornar um conjunto de resultados, nesse caso você pode usar a cláusula RESULT SETS NONE. No entanto, a opção WITH RESULT SETS não pode ser especificada em uma instrução INSERT…EXEC. Além disso, o número de colunas retornadas como parte do conjunto de resultados não pode ser alterado.

Exemplo – Uso

Vamos dar uma olhada em um exemplo para entender melhor como a cláusula WITH RESULT SETS funciona. Neste exemplo, vamos criar uma tabela chamada “Employee” e inserir alguns dados nela. Em seguida, vamos criar um procedimento armazenado chamado “GetEmployees” que seleciona dados da tabela “Employee” e retorna o conjunto de resultados.

Por padrão, quando executamos o procedimento armazenado “GetEmployees”, o conjunto de resultados é retornado com os nomes das colunas e os tipos de dados especificados no corpo do procedimento armazenado. No entanto, se quisermos ter controle sobre os nomes das colunas e os tipos de dados, podemos usar a cláusula WITH RESULT SETS.

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Employee]') AND type in (N'U'))
    DROP TABLE [dbo].[Employee]
GO

CREATE TABLE [dbo].[Employee] (
    [EmpId] [INT] NOT NULL IDENTITY PRIMARY KEY,
    [FirstName] NVARCHAR(100) NOT NULL,
    [MiddleName] NVARCHAR(100) NULL,
    [LastName] NVARCHAR(100) NOT NULL
)
GO

INSERT INTO [dbo].[Employee] (FirstName, MiddleName, LastName)
VALUES ('Arshad', NULL, 'Ali'),
       ('Paul', 'M', 'John')
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetEmployees]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[GetEmployees]
GO

CREATE PROCEDURE GetEmployees
AS
BEGIN
    SELECT EmpId, FirstName + ' ' + ISNULL(MiddleName, '') + ' ' + LastName AS Name
    FROM dbo.Employee
END
GO

EXECUTE GetEmployees
GO

EXECUTE GetEmployees WITH RESULT SETS (
    (EmployeeId INT, EmployeeName VARCHAR(150))
)
GO

No exemplo acima, primeiro criamos a tabela “Employee” e inserimos alguns dados nela. Em seguida, criamos o procedimento armazenado “GetEmployees” que seleciona dados da tabela “Employee” e retorna o conjunto de resultados.

Quando executamos o procedimento armazenado “GetEmployees” sem a cláusula WITH RESULT SETS, o conjunto de resultados é retornado com os nomes das colunas e os tipos de dados especificados no corpo do procedimento armazenado. No entanto, quando executamos o procedimento armazenado “GetEmployees” com a cláusula WITH RESULT SETS, temos controle sobre os nomes das colunas e podemos definir um tipo de dados diferente (embora compatível apenas) para cada coluna do conjunto de resultados sendo retornado.

Não só podemos usar a cláusula WITH RESULT SETS com um procedimento armazenado que retorna um único conjunto de resultados, mas também podemos usá-la com um procedimento armazenado que retorna vários conjuntos de resultados. No exemplo abaixo, você pode ver que o procedimento armazenado “GetEmployeesWithMultipleResultsets” retorna dois conjuntos de resultados, e os nomes das colunas e os tipos de dados de cada coluna de cada conjunto de resultados estão sendo redefinidos separadamente.

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetEmployeesWithMultipleResultsets]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[GetEmployeesWithMultipleResultsets]
GO

CREATE PROCEDURE GetEmployeesWithMultipleResultsets
AS
BEGIN
    SELECT EmpId, FirstName + ' ' + ISNULL(MiddleName, '') + ' ' + LastName AS Name
    FROM dbo.Employee

    SELECT EmpId, FirstName + ' ' + ISNULL(MiddleName, '') + ' ' + LastName AS Name
    FROM dbo.Employee
END
GO

EXEC GetEmployeesWithMultipleResultsets
GO

EXECUTE GetEmployeesWithMultipleResultsets WITH RESULT SETS (
    (EmployeeId1 INT, EmployeeName1 VARCHAR(150)),
    (EmployeeId2 INT NOT NULL, EmployeeFullName2 VARCHAR(150) NOT NULL)
)
GO

Conclusão

Neste artigo, discutimos a cláusula WITH RESULT SETS no SQL Server, que nos permite redefinir o nome e os tipos de dados das colunas que estão sendo retornadas como um conjunto de resultados de um procedimento armazenado. Esse recurso pode ser usado tanto com conjuntos de resultados únicos quanto com múltiplos conjuntos de resultados, dando-nos controle sobre a formatação e nomeação das colunas.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.