sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo corregir "La declaración EXECUTE falló porque su cláusula WITH RESULT SETS especificó 2 columnas para el conjunto de resultados..." Msg 11537 en SQL Server

Si encuentra el mensaje de error 11537, nivel 16 en SQL Server, lo más probable es que esté intentando ejecutar un procedimiento almacenado utilizando WITH RESULT SETS cláusula, pero no ha incluido todas las columnas en su definición.

Cuando usas WITH RESULT SETS cláusula en EXECUTE /EXEC declaración, debe proporcionar una definición para todas las columnas devueltas por el procedimiento almacenado. Si no lo hace, obtendrá este error.

Ejemplo

El siguiente procedimiento almacenado devuelve tres columnas.

EXEC sp_getCityById @CityId = 1;

Resultado:

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

Ahora, supongamos que queremos redefinir algunas de las columnas. Podemos usar WITH RESULT SETS cláusula para hacer eso.

Código de problema

Pero si no incluimos las tres columnas en esta cláusula, obtendremos un error.

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.

El mensaje de error nos dice cuántas columnas especificamos y cuántas envió el procedimiento almacenado.

En este caso, especificamos dos columnas pero el procedimiento envió tres.

Buen código

Podemos solucionar este problema incluyendo la tercera columna.

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   |
+------------+--------------+--------------+