2010-04-07 5 views
0

У меня проблемы с динамической сортировкой с использованием ROW Number в SQL Server. У меня он работает, но он бросает ошибки на не числовые поля. Что мне нужно изменить, чтобы получить сортировки с Alpha Working ???номер строки над текстом столбца сортировка

ID Description 
5 Test  
6 Desert 
3 A evil 

Ive получил 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 Примечание: Добавление '@count является null' условие для предиката сильно замедлит ваш запрос. Вы должны изменить эту строку на 'или row <= ISNULL (@StartIndex + @Count, 2147483647)'. Это выглядит глупо, но если стол большой, то это будет иметь большое значение. То же самое касается и других предикатов '@param IS NULL', они действительно будут убивать производительность запросов. – Aaronaught

+0

Вы решили эту проблему? –

+0

Я думаю, вам не нужен дополнительный ORDER BY, если у вашего SELECT уже есть один. –

ответ

0

она отлично работает для меня:

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 

выход:

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

(3 row(s) affected) 

возможно размещать более подробную информацию о данных, которые вы с этим и с фактическим erro r сообщение.

EDIT на основе комментариев OP, попробуйте это:

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 

Я в основном преобразовать идентификаторы строк, используя эту логику:

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

Изменить @Order, чтобы быть varchar (50), а не 10, 10 усекает порядок сортировки, и поэтому часть заказа пропущена –

+0

Так что, в основном, мне нужно преобразовать все столбцы в один тип данных (varchar) для сортировки? У меня есть другие столбцы в таблице и просто хочу убедиться. –

+0

Я всегда делаю это (преобразование в строку), но я обычно объединяю столбцы при сортировке, чтобы различать, когда первичный столбец может иметь дубликаты. Например, если вы сортируете по дате (нет времени), вы хотите включить дополнительные столбцы, потому что могут быть строки с одинаковой датой. Когда вы конвертируете в строку, подумайте о том, как они сортируются: номерам нужны ведущие нули (или вы получите 1,10,11,2,22 ...) формат datetimes, используя стиль 121 (ГГГГ-ММ-ДД hh: mi: ss .mmm), положить трубы "|" или что-то между столбцами, пустые нули и т. д. –

Смежные вопросы