2010-04-07 9 views
0

Je rencontre des problèmes avec le tri dynamique à l'aide du numéro de ligne dans SQL Server. Je l'ai fonctionné mais il jette des erreurs sur des champs non numériques. Qu'est-ce que j'ai besoin de changer pour obtenir des sortes avec Alpha Working ???numéro de ligne sur le tri de colonne de texte

ID Description 
5 Test  
6 Desert 
3 A evil 

Ive a obtenu un Sql Prodcedure

CREATE PROCEDURE [CRUDS].[MyTable_Search] 
    -- Add the parameters for the stored procedure here 
    -- Full Parameter List 
    @ID int = NULL,  
    @Description nvarchar(256) = NULL, 
    @StartIndex int = 0, 
    @Count int = null, 
    @Order varchar(128) = 'ID asc' 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
Select * from 
    (
     Select ROW_NUMBER() OVER 
      (Order By 
       case 
        when @Order = 'ID asc' then [TableName].ID 
        when @Order = 'Description asc' then [TableName].Description  
       end asc, 
       case 
        when @Order = 'ID desc' then [TableName].ID 
        when @Order = 'Description desc' then [TableName].Description 
       end desc 
      ) as row, 
      [TableName].* from [TableName] 
     where 
      (@ID IS NULL OR [TableName].ID = @ID) AND 
      (@Description IS NULL OR [TableName].Description = @Description) 
) as a 
where 
    row > @StartIndex 
    and (@Count is null or row <= @StartIndex + @Count) 
order by 
    case 
     when @Order = 'ID asc' then a.ID  
     when @Order = 'Description asc' then a.Description 
    end asc, 
    case 
     when @Order = 'ID desc' then a.ID 
     when @Order = 'Description desc' then a.Description 
    end desc 


END 
+1

Side note: Ajout du '@Count est null' condition au prédicat ralentira beaucoup votre requête. Vous devriez changer cette ligne à 'ou row <= ISNULL (@StartIndex + @Count, 2147483647)'. Cela a l'air idiot mais si la table est grande, cela fera une grande différence. Il en va de même pour les autres prédicats '@param IS NULL', ils vont vraiment tuer les performances des requêtes. – Aaronaught

+0

avez-vous résolu ce problème? –

+0

Je pense que vous n'avez pas besoin de l'ORDER BY supplémentaire si votre SELECT en a déjà un. –

Répondre

0

cela fonctionne bien pour moi:

declare @TableName table (id int,Description varchar(50)) 
insert @TableName values (1,'aaa') 
insert @TableName values (2,'bbb') 
insert @TableName values (3,'ccc') 
insert @TableName values (4,'ddd') 
insert @TableName values (5,'eee') 
insert @TableName values (6,'fff') 
insert @TableName values (7,'ggg') 
insert @TableName values (8,'hhh') 
DECLARE @Order   varchar(10) 
     ,@ID   int 
     ,@Description varchar(50) 
     ,@StartIndex int 
     ,@Count   int 

SELECT @Order='Description desc' 
     ,@StartIndex=2 
     ,@Count=3 

--query unchanged, except alias to "t" and table name to "@TableName" 
Select * from 
    (
     Select ROW_NUMBER() OVER 
      (Order By 
       case 
        when @Order = 'ID asc' then t.ID 
        when @Order = 'Description asc' then t.Description  
       end asc, 
       case 
        when @Order = 'ID desc' then t.ID 
        when @Order = 'Description desc' then t.Description 
       end desc 
      ) as row, 
      t.* from @TableName t 
     where 
      (@ID IS NULL OR t.ID = @ID) AND 
      (@Description IS NULL OR t.Description = @Description) 
) as a 
where 
    row > @StartIndex 
    and (@Count is null or row <= @StartIndex + @Count) 
order by 
    case 
     when @Order = 'ID asc' then a.ID  
     when @Order = 'Description asc' then a.Description 
    end asc, 
    case 
     when @Order = 'ID desc' then a.ID 
     when @Order = 'Description desc' then a.Description 
    end desc 

sortie:

row     id   Description 
-------------------- ----------- ------------- 
3     3   ccc 
4     4   ddd 
5     5   eee 

(3 row(s) affected) 

publier éventuellement plus de détails sur les données que vous êtes courir cela avec et l'erro réelle r message.

EDIT basé sur le commentaire de l'OP, essayez ceci:

declare @TableName table (id int,Description varchar(50)) 
insert @TableName values (1,'1') 
insert @TableName values (2,'bbb') 
insert @TableName values (3,'ccc') 
insert @TableName values (4,'ddd') 
insert @TableName values (5,'eee') 
insert @TableName values (6,'fff') 
insert @TableName values (7,'ggg') 
insert @TableName values (8,'hhh') 
DECLARE @Order   varchar(50) 
     ,@ID   int 
     ,@Description varchar(50) 
     ,@StartIndex int 
     ,@Count   int 

SELECT @Order='Description desc' 
     ,@StartIndex=2 
     ,@Count=3 

Select * from 
    (
     Select ROW_NUMBER() OVER 
      (Order By 
       case 
        when @Order = 'ID asc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),t.ID),10) 
        when @Order = 'Description asc' then t.Description  
       end asc, 
       case 
        when @Order = 'ID desc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),t.ID),10) 
        when @Order = 'Description desc' then t.Description 
       end desc 
      ) as row, 
      t.* from @TableName t 
     where 
      (@ID IS NULL OR t.ID = @ID) AND 
      (@Description IS NULL OR t.Description = @Description) 
) as a 
where 
    row > @StartIndex 
    and (@Count is null or row <= @StartIndex + @Count) 
order by 
    case 
     when @Order = 'ID asc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),a.ID),10) 
     when @Order = 'Description asc' then a.Description 
    end asc, 
    case 
     when @Order = 'ID desc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),a.ID),10) 
     when @Order = 'Description desc' then a.Description 
    end desc 

je convertir essentiellement les ID de chaînes en utilisant cette logique:

RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),ID),10) 
+0

Modifier @Order pour être un varchar (50) plutôt que 10, 10 tronque l'ordre de tri et donc la partie de commande est ignorée –

+0

Donc, fondamentalement, je dois convertir toutes les colonnes en un seul type de données (varchar) pour le tri? J'ai d'autres colonnes dans la table et je veux juste m'en assurer. –

+0

Je le fais toujours (convertir en chaîne), mais je combine généralement des colonnes lors du tri pour différencier quand la colonne principale pourrait avoir des doublons. Par exemple, si vous effectuez un tri par date (pas de temps), vous voudrez inclure des colonnes supplémentaires, car il peut y avoir des lignes avec la même date. Lorsque vous convertissez en chaîne, pensez à la façon dont ils trient: les nombres doivent contenir des zéros (ou vous obtiendrez des datages au format 1,10,11,2,22 ...) en utilisant le style 121 (AAAA-MM-JJ hh: mi: ss .mmm), mettre des tuyaux "|" ou quelque chose entre les colonnes, les nulls de pad, etc. –