2017-09-05 49 views
0

我得到的錯誤排序:算術溢出錯誤當[時間戳](列名)

Arithmetic overflow error converting expression to data type smalldatetime

請注意,我已經搜查這個話題,但我的錯誤是因爲它獨特的是由ORDER BY子句引起的。問題行是 WHEN 'TimeStamp' THEN [MyTable].[TimeStamp]

當我評論那些TimeStamp,查詢成功執行,但我仍然需要一個解決方案來排序我的TimeStamp列(重命名列是不可能的)。

這是我的查詢:

SELECT 
    Id, 
    [TimeStamp], 
    StatusCode 
FROM 
    (
    SELECT 
     TOP (@EndRecord) ROW_NUMBER() OVER 
     (  
     ORDER BY 
      CASE @SortDirection 
       WHEN 'Desc' THEN 
        CASE @SortColumn       
         WHEN 'Id' THEN [MyTable].[Id] 
         WHEN 'TimeStamp' THEN [MyTable].[TimeStamp] 
         WHEN 'StatusCode' THEN [MyTable].[StatusCode] 

         ELSE [MyTable].[TimeStamp] 
        END 
      END DESC, 
      CASE @SortDirection 
       WHEN 'Asc' THEN 
        CASE @SortColumn       
         WHEN 'Id' THEN [MyTable].[Id] 
         WHEN 'TimeStamp' THEN [MyTable].[TimeStamp]      
         WHEN 'StatusCode' THEN [MyTable].[StatusCode]      

         ELSE [MyTable].[TimeStamp] 
        END    
      END ASC     
     ) AS 'Row', 
     [MyTable].[Id] AS 'Id', 
     [MyTable].[TimeStamp] AS 'TimeStamp', 
     [MyTable].[StatusCode] AS 'StatusCode' 
    FROM 
     [MyTable] 
    WHERE 
     (@Filter_Id is null or [MyTable].[Id] = @Filter_Id) AND  
     (@Filter_StatusCode is null or [MyTable].[StatusCode] = @Filter_StatusCode) AND 
     (@Filter_FromTimeStamp IS NULL OR [MyTable].[TimeStamp] >= @Filter_FromTimeStamp) AND 
     (@Filter_TillTimeStamp IS NULL OR [MyTable].[TimeStamp] <= @Filter_TillTimeStamp) 
    ) AS t1 
WHERE 
    Row >[email protected] AND 
    Row <= @EndRecord 
+0

@gcaton我的專欄名稱是'TimeStamp' –

回答

3

CASE表達必須返回特定類型的值。所有THEN條款必須同意該類型或允許data type precedence規則確定總體類型並應用轉換。

由於您可能不想將所有內容轉換爲字符串並根據文本排序規則執行排序操作,您需要拆分CASE表達式,以便不強制類型之間的任何轉換。

例如

ORDER BY 
     CASE WHEN @SortDirection='Desc' and @SortColumn = 'Id'       
      THEN [MyTable].[Id] 
     END DESC, 
     CASE WHEN @SortDirection='Desc' and @SortColumn = 'TimeStamp'       
      THEN [MyTable].[TimeStamp] 
     END DESC, 
     CASE WHEN @SortDirection='Desc' and @SortColumn='StatusCode' 
      THEN [MyTable].[StatusCode] 
     END DESC, 
     CASE WHEN @SortDirection='Desc' and @SortColumn not in ('Id','TimeStamp','StatusCode') 
      THEN [MyTable].[TimeStamp] 
     END DESC, 

而且類似的你的升序排序。

+0

偉大的解決方案!有效 –