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