2014-01-13 6 views
0

У меня следующий запросSQL упорядочить по переменной с различным типом данных

DECLARE @OrderBy INT 
SET @OrderBy = 1 
DECLARE @PageSize INT 
SET @PageSize = 10 
DECLARE @PageIndex INT 
SET @PageIndex = 1 


SELECT exp.ExportId 
    ,exp.ExportDate 
    ,exp.UniqueExportId 
    ,exp.ExporterOfRecord 
    ,exp.PartNo 
    ,exp.Description 
    ,exp.AvailQty AS Quantity 
    ,exp.UnitOfMeasuremnt 
    ,exp.Destination 
    --,exp.ScheduledB, 
    ,tp.HTSUS AS ScheduledB 
FROM tblCASIDD_Export exp 
    LEFT JOIN tblCASIDD_Part tp 
    ON tp.PartNo = exp.PartNo 


ORDER BY (
     CASE @OrderBy 
      WHEN 1 
       THEN exp.PartNo 
      WHEN 2 
       THEN exp.ExportDate 
      END 
     ) OFFSET @PageSize * (@PageIndex - 1) ROWS 

FETCH NEXT @PageSize ROWS ONLY 

, когда я дать OrderBy 1 (VARCHAR) он выдает ошибку

Конверсия удалось при преобразовании даты и/или времени из строки символов ,

Его ошибка метание с типом данных, кроме типа даты

, а с даты ввода его рабочий

любое предложение, что я делаю неправильно

Благодаря

ответ

3

типы всех вариантов в операторе CASE ORDER BY необходимо сопоставить, поэтому вам нужно будет использовать что-то общее, например

CASE @OrderBy 
     WHEN 1 
      THEN CAST(exp.PartNo AS NVARCHAR(20)) 
     WHEN 2 
      THEN CAST(exp.ExportDate AS NVARCHAR(20)) 
     END 

(оптимальный тип приведение к будет зависеть от нативных типов PartNo и ExportDate)

SqlFiddle here

+0

С литым я сделал, но почему его ошибка бросания в разных типах данных –

+0

Не могли бы вы дать точные типы 'PartNo' и' ExportDate'? – StuartLC

+1

@ Md.ParvezAlam - потому что выражения 'CASE' являются общей формой выражения - здесь случай * необычный *, что все строки возвращают значения из * того же предложения' 'THEN'. Таким образом, код должен быть сгенерирован для ожидания сочетания значений из любого из предложений «THEN» (или предложения «ELSE»). И поэтому SQL должен решить, какой тип данных предназначен для всего выражения CASE, он принимает все возможные типы данных из каждого предложения, а затем использует правила приоритета для определения одного типа данных, в котором будут указаны все значения клаузинга конвертировано в. В вашем случае он выбрал 'datetime'. –

1

Как говорит Стюарт, все возможные значения выражения CASE должны быть обменены на одиночный type. Стюарт показал one way, чтобы исправить это, но это приводит к потере «ожидаемого» порядка сортировки при смешивании типов данных. Обычно это лучше сделать это как два (или более) отдельных CASE выражений , которые затем могут иметь свои природные типы (и другие CASE вычисления выражений NULL с которой все вроде вместе)

ORDER BY CASE @OrderBy WHEN 1 THEN exp.PartNo END, 
     CASE @OrderBy WHEN 2 THEN exp.ExportDate END 
OFFSET @PageSize * (@PageIndex - 1) ROWS 

Обычно у вас должно быть одно выражение CASE для каждого желаемого конечного типа данных. Поэтому, если у вас есть 3 возможных столбца int, и 2 datetime столбцов, вы все равно должны иметь выражения 2 CASE - один имеет дело со всеми столбцами int, а другой - с столбцами datetime.

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