2009-10-25 117 views
1

WhenI调用这个存储过程:SQL转换失败错误

ALTER PROCEDURE [dbo].[GetSorted] 
(
    @OrderByColumn nvarchar(256) 

) 
AS 
SET NOCOUNT ON  

    SELECT itDocs.AddedDate, itDocs.AddedBy FROM itDocs  
    ORDER BY 
      CASE WHEN @OrderByColumn='AddedDate' THEN itDocs.AddedDate 
        WHEN @OrderByColumn='AddedBy' THEN itDocs.AddedBy 

     END ASC       

我得到错误:

Conversion failed when converting date and/or time from character string

这是我怎么称呼SP:

DECLARE @return_value int 

EXEC @return_value = [dbo].[GetSorted] 

     @OrderByColumn = 'AddedBy' 


SELECT 'Return Value' = @return_value 

GO 

UPDATE: 如果我使用多情况下的做法,如拳头2个答案建议, 尝试添加另一种情况为方向,当我得到的错误:

ORDER BY 
     CASE WHEN @OrderDirection=0 THEN    
      CASE WHEN @OrderByColumn='AddedDate' THEN itDocs.AddedDate END ASC, 
      CASE WHEN @OrderByColumn='AddedBy' THEN itDocs.AddedBy END ASC  
     end  
     CASE WHEN @OrderDirection=1 THEN 
+0

关于您的更新,要将订单方向添加为一个存储过程的参数,您可以扩展CASE语句中的布尔表达式来检查列和方向。请看我更新的答案。 – Tim 2009-10-25 15:52:36

回答

2

这里是一个很好的文章,解释您收到的错误:

Using CASE in ORDER BY clause

您可以将存储过程改变以下是允许ORDER BY子句中的CASE工作(现在编辑为包括订单方向作为参数):

ALTER PROCEDURE [dbo].[GetSorted] 
(
    @OrderByColumn nvarchar(256), 
    @OrderDirection int 
) 
AS 
SET NOCOUNT ON    
    SELECT itDocs.AddedDate, itDocs.AddedBy FROM itDocs   
     ORDER BY    
     CASE WHEN @OrderByColumn='AddedDate' AND @OrderDirection=0 THEN itDocs.AddedDate END ASC, 
     CASE WHEN @OrderByColumn='AddedBy' AND @OrderDirection=0 THEN itDocs.AddedBy END ASC,   
     CASE WHEN @OrderByColumn='AddedDate' AND @OrderDirection=1 THEN itDocs.AddedDate END DESC, 
     CASE WHEN @OrderByColumn='AddedBy' AND @OrderDirection=1 THEN itDocs.AddedBy END DESC 
+0

请参阅我的更新 – samuel 2009-10-25 15:26:40

+0

我更新了我的答案,将订单方向作为基于您的问题更新的参数。 – Tim 2009-10-25 15:47:03

3

您试图转换数据类型,并且datetime具有更高的优先级。基本上“AddedBy =‘鲍勃’”无法转换......

SELECT 
    itDocs.AddedDate, itDocs.AddedBy 
FROM 
    itDocs  
ORDER BY 
    CASE OrderByColumn WHEN 'AddedDate' THEN itDocs.AddedDate ELSE '19000101' END, 
    CASE OrderByColumn WHEN 'AddedBy' THEN itDocs.AddedBy ELSE '' END 
+1

其他不是必需的,对吧? – samuel 2009-10-25 14:58:28

+1

请参阅我的更新 – samuel 2009-10-25 15:27:10