我在使用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
出于某种原因,除了BackupJobType
和Description
之外,这适用于每个列。
我已经检查了要发送的参数的值和列的名称,并且100%确定它们是正确的。
我在另一个页面上有一个几乎相同的查询,这两个列在那里工作正常。
有什么想法吗?
编辑:我忘了提及所有这些列都是varchar数据类型
答案 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
,因此它们不会影响订购。