Я работаю с SQL Server 2014 и пытаюсь выполнить (динамическую) хранимую процедуру из структуры сущностей.
Моя хранимая процедура имеет следующие входные параметры:
@Username NVARCHAR(100),
@Number DECIMAL,
@PageIndex INT = 1,
@PageSize INT = 20,
@Field1 NVARCHAR(12) = NULL,
@Field2 NVARCHAR(60) = NULL,
@Field3 NVARCHAR(60) = NULL,
@Field4 NVARCHAR(60) = NULL,
@Field5 NVARCHAR(60) = NULL,
@Field6 NVARCHAR(60) = 'ABC',
@Field7 NVARCHAR(4) = 'ABC',
@IsCountOnly BIT = 0,
@IsFilterOnly BIT = 0
EF генерирует следующий запрос (полученный через профилировщик SQL) на основе параметров, которые я добавил в свой массив, но учтите, что я добавляю только те, которые мне нужны, поскольку большинство из них являются необязательными.
exec sp_executesql
N'EXEC MySp @Username, @Number, @IsCountOnly',
N'@Username nvarchar(100), Number decimal(6,0), @IsCountOnly bit',
@Username=N'me@mycompany.com', @Number=12345, @IsCountOnly=1
Когда я передаю @Username, @Number, которые оба являются обязательными, а затем передаю @IsCountOnly, моя хранимая процедура выполняется, но возвращает неправильные результаты, так как кажется, что значение, переданное через @IsCountOnly, обрабатывается как @PageIndex, а не как @IsCountOnly.
Обратите внимание, что если я вызываю EXEC непосредственно в SQL Server Management Studio
:
EXEC [dbo].[MySp]
@Username = N'me@mycompany.com',
@Number = 12345,
@IsCountOnly = 1
GO
Это работает, как ожидалось.
Чтобы проверить, была ли это проблема, явключил все параметры в exec sp_executesql N'EXEC ...
, и это сработало, как и ожидалось, но это выглядит просто излишним, когда нужно определить все параметры, когда в каком-то сценарии требуется всего несколькоios.
Это ошибка в SQL при работе с exec sp_executesql
и EXEC
или я что-то не так делаю ??
Спасибо.
UPDATE-1:
Обратите внимание, что когда я говорю, что он работает должным образом при передаче всех параметров, это не совсем верно, так как, когда я передаю ноль для необязательных параметров, на самом деле он не использует значения по умолчанию, которые в некоторой степени имеют смысл, ноэто означает, что мне придется передавать правильные значения по умолчанию в моем .NET
проекте, а не через SQL, который просто не идеален.