Jeśli napotkasz błąd Msg 11537, poziom 16 w SQL Server, prawdopodobnie próbujesz wykonać procedurę składowaną przy użyciu WITH RESULT SETS
klauzula, ale nie uwzględniłeś wszystkich kolumn w swojej definicji.
Gdy używasz WITH RESULT SETS
klauzula w EXECUTE
/EXEC
instrukcji, należy podać definicję dla wszystkich kolumn zwracanych przez procedurę składowaną. Jeśli tego nie zrobisz, otrzymasz ten błąd.
Przykład
Poniższa procedura składowana zwraca trzy kolumny.
EXEC sp_getCityById @CityId = 1;
Wynik:
+------------+----------------------------+-----------------------------+ | CityName | LatestRecordedPopulation | ValidFrom | |------------+----------------------------+-----------------------------| | Aaronsburg | 613 | 2013-01-01 00:00:00.0000000 | +------------+----------------------------+-----------------------------+
Załóżmy teraz, że chcemy przedefiniować niektóre kolumny. Możemy użyć WITH RESULT SETS
klauzula, aby to zrobić.
Kod problemu
Ale jeśli nie uwzględnimy wszystkich trzech kolumn w tej klauzuli, otrzymamy błąd.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int
)
);
Wynik:
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.
Komunikat o błędzie informuje nas, ile kolumn określiliśmy i ile zostało wysłanych przez procedurę składowaną.
W tym przypadku określiliśmy dwie kolumny, ale procedura wysłana trzy.
Dobry kod
Możemy rozwiązać ten problem, dołączając trzecią kolumnę.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int,
[Valid From] date
)
);
Wynik:
------------+--------------+--------------+ | City | Population | Valid From | |------------+--------------+--------------| | Aaronsburg | 613 | 2013-01-01 | +------------+--------------+--------------+