Nếu bạn gặp phải lỗi Msg 11537, Mức 16 trong SQL Server, rất có thể bạn đang cố gắng thực thi một quy trình được lưu trữ bằng cách sử dụng WITH RESULT SETS
nhưng bạn chưa bao gồm tất cả các cột trong định nghĩa của mình.
Khi bạn sử dụng WITH RESULT SETS
mệnh đề trong EXECUTE
/ EXEC
, bạn phải cung cấp định nghĩa cho tất cả các cột được trả về bởi thủ tục được lưu trữ. Nếu không, bạn sẽ gặp lỗi này.
Ví dụ
Thủ tục được lưu trữ sau đây trả về ba cột.
EXEC sp_getCityById @CityId = 1;
Kết quả:
+------------+----------------------------+-----------------------------+ | CityName | LatestRecordedPopulation | ValidFrom | |------------+----------------------------+-----------------------------| | Aaronsburg | 613 | 2013-01-01 00:00:00.0000000 | +------------+----------------------------+-----------------------------+
Bây giờ, giả sử chúng ta muốn xác định lại một số cột. Chúng ta có thể sử dụng WITH RESULT SETS
mệnh đề để làm điều đó.
Mã sự cố
Nhưng nếu chúng tôi không bao gồm tất cả ba cột trong điều khoản này, chúng tôi sẽ gặp lỗi.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int
)
);
Kết quả:
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.
Thông báo lỗi cho chúng tôi biết có bao nhiêu cột mà chúng tôi đã chỉ định và bao nhiêu cột đã được gửi bởi thủ tục được lưu trữ.
Trong trường hợp này, chúng tôi chỉ định hai cột nhưng thủ tục gửi ba cột.
Mã tốt
Chúng tôi có thể khắc phục sự cố này bằng cách bao gồm cột thứ ba.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int,
[Valid From] date
)
);
Kết quả:
------------+--------------+--------------+ | City | Population | Valid From | |------------+--------------+--------------| | Aaronsburg | 613 | 2013-01-01 | +------------+--------------+--------------+