Ако срещнете грешка Msg 11537, ниво 16 в SQL Server, има вероятност да се опитвате да изпълните съхранена процедура с помощта на WITH RESULT SETS
клауза, но не сте включили всички колони във вашата дефиниция.
Когато използвате WITH RESULT SETS
клауза в EXECUTE
/EXEC
оператор, трябва да предоставите дефиниция за всички колони, върнати от съхранената процедура. Ако не го направите, ще получите тази грешка.
Пример
Следната съхранена процедура връща три колони.
EXEC sp_getCityById @CityId = 1;
Резултат:
+------------+----------------------------+-----------------------------+ | CityName | LatestRecordedPopulation | ValidFrom | |------------+----------------------------+-----------------------------| | Aaronsburg | 613 | 2013-01-01 00:00:00.0000000 | +------------+----------------------------+-----------------------------+
Да предположим, че искаме да предефинираме някои от колоните. Можем да използваме WITH RESULT SETS
клауза за това.
Код на проблема
Но ако не включим и трите колони в тази клауза, ще получим грешка.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int
)
);
Резултат:
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.
Съобщението за грешка ни казва колко колони сме посочили и колко са изпратени от съхранената процедура.
В този случай посочихме две колони, но процедурата изпрати три.
Добър код
Можем да решим този проблем, като включим третата колона.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int,
[Valid From] date
)
);
Резултат:
------------+--------------+--------------+ | City | Population | Valid From | |------------+--------------+--------------| | Aaronsburg | 613 | 2013-01-01 | +------------+--------------+--------------+