【问题标题】:SQL Conversion failed ErrorSQL 转换失败错误
【发布时间】:2009-10-25 14:09:16
【问题描述】:

当我调用这个存储过程时:

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                        

我得到错误:

转换日期时转换失败 和/或字符串中的时间

.

这就是我所说的 SP:

DECLARE @return_value int

EXEC    @return_value = [dbo].[GetSorted]

        @OrderByColumn = 'AddedBy'


SELECT  'Return Value' = @return_value

GO

更新: 如果我按照第 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  

【问题讨论】:

  • 关于您的更新,要将订单方向作为参数添加到存储过程中,您可以扩展 CASE 语句中的布尔表达式以检查列和方向。请查看我的更新答案。

标签: sql sql-server sql-order-by


【解决方案1】:

您正在尝试转换数据类型,而 datetime 具有更高的优先级。基本上“AddedBy = 'bob'”不能转换...

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

【讨论】:

    【解决方案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 
    

    【讨论】:

    • 我根据您对问题的更新更新了我的答案,将订单方向作为参数包含在内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多