【发布时间】:2015-11-10 06:08:17
【问题描述】:
我正在使用 SQL 参数来允许用户使用视图中的下拉菜单创建自己的 SELECT 查询。参数值使用 MVC 控制器中的实体框架从视图传递到存储过程。
我试图避免使用动态 SQL,所以我有几个选项可以做到这一点。
这是我最终选择的方法:
@topLeftInput varchar(100),
@topRightInput varchar(100)
AS
BEGIN
Select * from test
where
CASE @topLeftInput
WHEN 'BasicReturnReasonId' THEN BasicReturnReasonId
WHEN 'ClientName' THEN ClientName
WHEN 'CreditDeniedReasonId' THEN CreditDeniedReasonId
WHEN 'ItemsnotReturnedReasonId' THEN ItemsnotReturnedReasonId
WHEN 'ManufacturerId' THEN ManufacturerId
WHEN 'ManufacturerOrderNumber' THEN ManufacturerOrderNumber
WHEN 'ProductConditionId' THEN ProductConditionId
ELSE NULL
END
= @topRightInput;
END
当@topLeftInput 为ClientName 或ManufacturerOrderNumber 时发生异常。当@topLeftInput 等于其中任何一个时,用户可以在文本框中输入@topRightInput 的值,而不是使用下拉菜单。
我收到一个异常,提示将 varchar 值转换为 int 时出错。不知道它为什么要这样做。
在我之前使用的技术中,这个异常并没有发生,它工作得很好(只是第一个选项的一个例子):
if @topLeftInput = 'BasicReturnReasonId'
Begin
Select * from test
where BasicReturnReasonId = @topRightInput;
End
为什么将这个 if 语句方法更改为 CASE 会导致这种异常?
【问题讨论】:
标签: sql sql-server asp.net-mvc sql-server-2008 stored-procedures