我正在使用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。
请注意,如果我直接在SQL Server Management Studio
中调用EXEC:
EXEC [dbo].[MySp]
@Username = N'me@mycompany.com',
@Number = 12345,
@IsCountOnly = 1
GO
它按预期工作。
要测试这是否是问题,我将所有参数都包含在exec sp_executesql N'EXEC ...
中,并且按预期方式工作,但是在某些情况下仅需要几个参数时就必须定义所有参数,这似乎有点过头了
使用exec sp_executesql
和EXEC
时这是SQL中的错误吗?还是我做错了什么?
谢谢。
UPDATE-1:
请注意,当我说它在传递所有参数时按预期工作时,并不完全如我为可选参数传递null时那样,它实际上并没有使用所提供的默认值,在某种程度上可以理解,但这意味着我则必须在我的.NET
项目中传递正确的默认值,而不是通过SQL传递,但这并不理想。
答案 0 :(得分:1)
您可以使用命名参数:
if (isPlatformBrowser(this.platformId)) { // Client only code }