【问题标题】:CASE not working properly in SQL Server stored procedureCASE 在 SQL Server 存储过程中无法正常工作
【发布时间】:2014-03-04 21:01:03
【问题描述】:

我在使用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 数据类型

【问题讨论】:

  • 发布一些示例输出,向我们展示它是如何不工作的。
  • 原因可能与所有列必须转换为相同类型有关。没有例子,很难准确地说出发生了什么。
  • 如何不工作的问题仍然适用。
  • @McFixit @sortBy 参数是否小于 varchar(11),也许是 varchar(10)?如果是这样,则“Description”变为“Descriptio”,“BackupJobType”变为“BackupJobT”,但其他列名适合。如果是这种情况,请将 @sortBy 数据类型提升为类似 varchar(50) 的类型。

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


【解决方案1】:

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

【讨论】:

  • 嗯,这是我一段时间以来犯的最愚蠢的错误之一,就是这样。谢谢
【解决方案2】:

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

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

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)

不匹配的子句都会产生NULLs,所以不会影响排序。

【讨论】:

  • 有机会我会试试这个,但是我应该指出,这是一个更大的查询的一个较小的子集,它有 IF 语句来整理不同的数据类型。此列表中的所有内容都是 varchar 类型
  • @McFixit 。 . .好吧,列的类型不是问题。我的下一个怀疑是您对排序的期望是错误的。你能编辑你的问题并提供一个例子来说明这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多