Question

Quand j’appelle cette procédure stockée:

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                        

Je reçois une erreur:

  

La conversion a échoué lors de la conversion de la date   et / ou le temps de la chaîne de caractères

.

C’est ainsi que j’appelle SP:

DECLARE @return_value int

EXEC    @return_value = [dbo].[GetSorted]

        @OrderByColumn = 'AddedBy'


SELECT  'Return Value' = @return_value

GO

MISE À JOUR: Si j'utilise l'approche multi-cas comme suggéré dans les réponses du premier poing, Je reçois une erreur en essayant d’ajouter un autre cas d’orientation:

  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  
Était-ce utile?

La solution

Voici un bon article expliquant l'erreur que vous recevez:

Utilisation de CASE dans la clause ORDER BY

Vous pouvez modifier votre procédure stockée comme suit pour permettre au CASE de la clause ORDER BY de fonctionner (maintenant modifié pour inclure la direction de la commande en tant que paramètre):

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 

Autres conseils

Vous essayez de convertir des types de données et la date / heure a une priorité plus élevée. En gros, " AddedBy = 'bob' " ne peut pas être converti ...

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top