运行完全相同的sql命令,我得到一个错误,具体取决于存储过程中定义参数的顺序。最初使用通过实体框架映射的存储过程遇到此错误,但这似乎不是问题的原因。
错误消息'将数据类型nvarchar转换为int时出错。'使得看起来像sproc试图将@CagIdList参数阻塞到一个可以为空的int参数中。想法?
Sql命令:
exec sp_executesql
N'rptAll.usp_SprocParameterTest @StartDate, @EndDate, @CAGIdList',
N'@StartDate datetime,@EndDate datetime,@CAGIdList nvarchar(1317)',
@StartDate='2014-11-16 00:00:00',@EndDate='2014-12-16 00:00:00',@CAGIdList=N'857,858,859'
以上命令将失败并显示此存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [rptAll].[usp_SprocParameterTest]
(
@StartDate datetime,
@EndDate datetime,
@StartRow int = null, -- please note where this parameter started
@MaxRows int = null, -- me too
@Sort varchar(255)= null,
@mfgCode varchar(255) = null,
@CAGIdList varchar(max) = null
)
as
select 1
这个存储过程也会成功:
--Move the nullable int params to the end of the list
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [rptAll].[usp_SprocParameterTest]
(
@StartDate datetime,
@EndDate datetime,
@Sort varchar(255)= null,
@mfgCode varchar(255) = null,
@CAGIdList varchar(5000) = null,
@StartRow int = null, --look at mee
@MaxRows int = null --hey me too
)
as
select 1
答案 0 :(得分:2)
这是因为您正在调用该过程并为三个第一个参数提供值,而不管它们的名称如何。您在查询中使用的参数名称与过程中的参数名称无关。
如果要为特定参数指定参数值,则必须为其命名:
rptAll.usp_SprocParameterTest @StartDate = @StartDate, @EndDate = @EndDate, @CAGIdList = @CAGIdList
这与调用不带参数名称的过程的区别相同:
rptAll.usp_SprocParameterTest '2014-11-16 00:00:00', '2014-12-16 00:00:00', N'857,858,859'
并带参数名称:
rptAll.usp_SprocParameterTest @StartDate = '2014-11-16 00:00:00', @EndDate = '2014-12-16 00:00:00', @CAGIdList = N'857,858,859'