Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como corrigir “falha na instrução EXECUTE porque sua cláusula WITH RESULT SETS especificou 2 colunas para o conjunto de resultados…” Msg 11537 in SQL Server


Se você encontrar a mensagem de erro 11537, nível 16 no SQL Server, é provável que esteja tentando executar um procedimento armazenado usando o WITH RESULT SETS cláusula, mas você não incluiu todas as colunas em sua definição.

Quando você usa o WITH RESULT SETS cláusula no EXECUTE /EXEC instrução, você deve fornecer uma definição para todas as colunas retornadas pelo procedimento armazenado. Se você não fizer isso, você receberá esse erro.

Exemplo


O procedimento armazenado a seguir retorna três colunas.
EXEC sp_getCityById @CityId = 1;

Resultado:
+------------+----------------------------+-----------------------------+
| CityName   | LatestRecordedPopulation   | ValidFrom                   |
|------------+----------------------------+-----------------------------|
| Aaronsburg | 613                        | 2013-01-01 00:00:00.0000000 |
+------------+----------------------------+-----------------------------+

Agora, suponha que queremos redefinir algumas das colunas. Podemos usar o WITH RESULT SETS cláusula para fazer isso.

Código do problema


Mas se não incluirmos todas as três colunas nesta cláusula, receberemos um erro.
EXEC sp_getCityById @CityId = 1
    WITH RESULT SETS   
    (  
        (
            [City] nvarchar(50),
            [Population] int
        )
    );

Resultado:
Msg 11537, Level 16, State 1, Procedure sp_getCityById, Line 5
EXECUTE statement failed because its WITH RESULT SETS clause specified 2 column(s) for result set number 1, but the statement sent 3 column(s) at run time.

A mensagem de erro nos informa quantas colunas especificamos e quantas foram enviadas pelo procedimento armazenado.

Nesse caso, especificamos duas colunas, mas o procedimento enviou três.

Bom Código


Podemos corrigir esse problema incluindo a terceira coluna.
EXEC sp_getCityById @CityId = 1
    WITH RESULT SETS   
    (  
        (
            [City] nvarchar(50),
            [Population] int,
            [Valid From] date
        )
    );

Resultado:
------------+--------------+--------------+
| City       | Population   | Valid From   |
|------------+--------------+--------------|
| Aaronsburg | 613          | 2013-01-01   |
+------------+--------------+--------------+