CASE在SQL Server存储过程中无法正常工作

时间:2014-03-04 21:01:04

标签: asp.net sql sql-server stored-procedures case

我在使用CASE语句更改存储过程中的ORDER BY语句时遇到问题。

我正在发送一个参数@sortBy,其中包含要订购的列的名称。

我的问题是CASE语句适用于大多数列,但不适用于其他列:

SELECT * FROM TapeView
                ORDER BY
                    CASE
                        WHEN @sortBy = 'BackupJobType' THEN [BackupJobType]
                        WHEN @sortBy = 'ItemID' THEN [ItemID]
                        WHEN @sortBy = 'MediaType' THEN [MediaType]
                        WHEN @sortBy = 'Category' THEN [Category]
                        WHEN @sortBy = 'Description' THEN [Description]
                        WHEN @sortBy = 'PlantName' THEN [PlantName]
                        WHEN @sortBy = 'BackupType' THEN [BackupType]
                        WHEN @sortBy = 'UserID' THEN [UserID]
                    END

出于某种原因,除了BackupJobTypeDescription之外,这适用于每个列。

我已经检查了要发送的参数的值和列的名称,并且100%确定它们是正确的。

我在另一个页面上有一个几乎相同的查询,这两个列在那里工作正常。

有什么想法吗?

编辑:我忘了提及所有这些列都是varchar数据类型

2 个答案:

答案 0 :(得分:2)

如果@sortBy存储过程参数或局部变量的数据类型小于“描述”的长度,即varchar(11),那么这就是你的问题。例如,如果@sortBy是varchar(10),则“Description”变为“Descriptio”(前10个字符),“BackupJobType”变为“BackupJobT”,但其他列名称适合。如果是这种情况,请将过程参数和/或局部变量的@sortBy数据类型更改为varchar(128)。

答案 1 :(得分:1)

问题可能是由类型引起的。我希望id也是一个问题,如果它们是数字的话。

将每个条件放在一个单独的子句中应解决问题:

ORDER BY (CASE WHEN @sortBy = 'BackupJobType' THEN [BackupJobType] END),
         (CASE WHEN @sortBy = 'ItemID' THEN [ItemID] END),
         (CASE WHEN @sortBy = 'MediaType' THEN [MediaType] END),
         (CASE WHEN @sortBy = 'Category' THEN [Category] END),
         (CASE WHEN @sortBy = 'Description' THEN [Description] END),
         (CASE WHEN @sortBy = 'PlantName' THEN [PlantName] END),
         (CASE WHEN @sortBy = 'BackupType' THEN [BackupType] END),
         (CASE WHEN @sortBy = 'UserID' THEN [UserID] END)

不匹配的条款将是所有产品NULL,因此它们不会影响订购。