Вызов sp_executesql EXEC не работает с необязательными параметрами - PullRequest
0 голосов
/ 27 июня 2019

Я работаю с 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, который просто не идеален.

1 Ответ

1 голос
/ 27 июня 2019

Вы можете использовать именованные параметры:

N'EXEC MySp @Username=@Username, @Number=@Number, @IsCountOnly=@IsCountOnly''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...