sp_executesql调用EXEC不适用于可选参数

时间:2019-06-27 11:23:54

标签: sql sql-server entity-framework

我正在使用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_executesqlEXEC时这是SQL中的错误吗?还是我做错了什么?

谢谢。

UPDATE-1:

请注意,当我说它在传递所有参数时按预期工作时,并不完全如我为可选参数传递null时那样,它实际上并没有使用所提供的默认值,在某种程度上可以理解,但这意味着我则必须在我的.NET项目中传递正确的默认值,而不是通过SQL传递,但这并不理想。

1 个答案:

答案 0 :(得分:1)

您可以使用命名参数:

if (isPlatformBrowser(this.platformId)) { // Client only code }