Ошибка преобразования SQL Ошибка - PullRequest
1 голос
/ 25 октября 2009

Когда я вызываю эту хранимую процедуру:

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

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  

Ответы [ 2 ]

3 голосов
/ 25 октября 2009

Вы пытаетесь преобразовать типы данных, а дата и время имеют более высокий приоритет. В основном "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 голосов
/ 25 октября 2009

Вот хорошая статья, объясняющая полученную ошибку:

Использование CASE в предложении ORDER BY

Вы можете изменить свою хранимую процедуру на следующую, чтобы позволить работе CASE в предложении ORDER BY (теперь отредактировано, чтобы включить направление заказа в качестве параметра):

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 
...