更改ORDER BY会导致“错误转换数据类型”

时间:2012-09-19 23:09:29

标签: sql sql-server stored-procedures

我想序言,我没有写这个。我今天早些时候继承了它,我一直在努力寻找解决方案。下面的代码库可以工作 - 除了每平方英尺成本以Alpha顺序而不是数字返回。

SELECT 
  CTE.Suite, CTE.Building, CS.Address, CS.City, CS.State, CTE.Tenant,
  CTE.AverageCharges, CTE.SQFT, CTE.CostSQFT, CTE.TenantType
FROM cteInvoices as CTE
   ...
ORDER BY 
  CASE @Order
       WHEN 'Suite' THEN CTE.Suite
       WHEN 'Cost' THEN cast(CTE.costSQFT as varchar)
  END

我将最终案例更改为以下内容:

 ORDER BY 
  CASE @Order
       WHEN 'Suite' THEN CTE.Suite
       WHEN 'Cost' THEN CTE.costSQFT
   END

这修复了成本排序,但是,当我选择按套件排序时,我得到:

  Msg 8114, Level 16, State 5, Procedure rCostSQFTcsort, Line 17
  Error converting data type varchar to numeric.

我整个晚上大部分时间都在努力工作,而我似乎没有做任何事情来解决这个问题 - 如果有什么事情会让事情变得更糟。我希望第二组眼睛可以解释这个问题。

1 个答案:

答案 0 :(得分:7)

如果这些不可转换为相同类型,您可能需要将它们分成两个单独的条款。原因是CASE是一个表达式,它返回单个数据类型的值,并且所有潜在选项提供的数据类型必须是可转换的。如果没有ELSE则返回NULL,那么它将为该“分支”命令所有行相同:

 ORDER BY 
  CASE @Order
       WHEN 'Suite' THEN CTE.Suite END,
  CASE @Order
       WHEN 'Cost' THEN CTE.costSQFT END;

您可能可以明确地转换其中一个,但这可能会改变其含义(例如,您可能仍希望11.09.0之后对进行排序,并且将两者都转换为字符串不会那样做。