存储过程会混淆命名参数'将数据类型nvarchar转换为int时出错。'

时间:2014-12-16 16:08:10

标签: sql-server stored-procedures named-parameters

运行完全相同的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

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'