2009-10-25 7 views
1

WhenI appeler cette procédure stockée:SQL Échec de la conversion Erreur

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       

J'obtiens l'erreur:

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

.

Voilà comment j'appelle SP:

DECLARE @return_value int 

EXEC @return_value = [dbo].[GetSorted] 

     @OrderByColumn = 'AddedBy' 


SELECT 'Return Value' = @return_value 

GO 

MISE À JOUR: Si je approche à plusieurs cas comme le suggère poing 2 réponses, je reçois une erreur en essayant de ajouté 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 
+0

en ce qui concerne votre mise à jour, ajouter direction ordre un paramètre de la procédure stockée, vous pouvez développer l'expression booléenne dans les instructions CASE pour vérifier à la fois la colonne et la direction. S'il vous plaît voir ma réponse mise à jour. – Tim

Répondre

2

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

Using CASE in ORDER BY clause

Vous pouvez modifier votre procédure stockée ce qui suit pour permettre le cas dans la clause ORDER BY au travail (maintenant modifié pour inclure la direction de commande comme 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 
+0

s'il vous plaît voir ma mise à jour – samuel

+0

J'ai mis à jour ma réponse pour inclure la direction de la commande en tant que paramètre basé sur la mise à jour de votre question. – Tim

3

Vous essayez de convertir des types de données et datetime a une priorité plus élevée. Fondamentalement « 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 
+1

L'autre n'est pas nécessaire, non? – samuel

+1

s'il vous plaît voir ma mise à jour – samuel

Questions connexes