Frage

wheni diese gespeicherte Prozedur aufrufen:

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                        

Ich erhalte Fehler:

  

Fehler bei der Konvertierung, wenn Datum konvertiert   und / oder die Zeit von Zeichenfolge

.

Dies ist, wie ich SP nennen:

DECLARE @return_value int

EXEC    @return_value = [dbo].[GetSorted]

        @OrderByColumn = 'AddedBy'


SELECT  'Return Value' = @return_value

GO

UPDATE: Wenn ich Multi-Fall-Ansatz verwenden, wie in der Faust 2 Antworten vorgeschlagen, Ich bekomme Fehler, wenn hinzugefügt einem anderen Fall zur Orientierung versuchen:

  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  
War es hilfreich?

Lösung

Hier ist ein guter Artikel zu erklären, welchen Fehler Sie erhalten:

Mit CASE in ORDER BY-Klausel

Sie können Ihre gespeicherte Prozedur die folgende Änderung der CASE in der ORDER BY-Klausel, damit arbeiten (jetzt editierten um Richtung als Parameter enthalten):

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 

Andere Tipps

Sie versuchen, Datentypen zu konvertieren und Datetime hat eine höhere Priorität. Im Grunde genommen "AddedBy = 'Bob'" kann nicht konvertiert werden ...

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top