Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come risolvere "istruzione EXECUTE non riuscita perché la sua clausola WITH RESULT SETS specificava 2 colonne per il set di risultati..." Msg 11537 in SQL Server

Se si verifica l'errore Msg 11537, livello 16 in SQL Server, è probabile che tu stia tentando di eseguire una procedura memorizzata utilizzando WITH RESULT SETS clausola, ma non hai incluso tutte le colonne nella tua definizione.

Quando usi WITH RESULT SETS clausola nel EXECUTE /EXEC istruzione, è necessario fornire una definizione per tutte le colonne restituite dalla stored procedure. In caso contrario, riceverai questo errore.

Esempio

La procedura memorizzata seguente restituisce tre colonne.

EXEC sp_getCityById @CityId = 1;

Risultato:

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

Supponiamo ora di voler ridefinire alcune delle colonne. Possiamo usare il WITH RESULT SETS clausola per farlo.

Codice problema

Ma se non includiamo tutte e tre le colonne in questa clausola, riceveremo un errore.

EXEC sp_getCityById @CityId = 1
    WITH RESULT SETS   
    (  
        (
            [City] nvarchar(50),
            [Population] int
        )
    );

Risultato:

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.

Il messaggio di errore ci dice quante colonne abbiamo specificato e quante sono state inviate dalla stored procedure.

In questo caso, abbiamo specificato due colonne ma la procedura ne ha inviate tre.

Buon codice

Possiamo risolvere questo problema includendo la terza colonna.

EXEC sp_getCityById @CityId = 1
    WITH RESULT SETS   
    (  
        (
            [City] nvarchar(50),
            [Population] int,
            [Valid From] date
        )
    );

Risultato:

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