1

У меня есть хранимая процедура, которая выбирает данные из нескольких таблиц (с использованием объединений) и возвращает их в отсортированном порядке (по возрастанию или по убыванию) на основе предоставленного столбца.Сортировка строки в datetime в хранимой процедуре с временной таблицей

Для создания сортированного результата на основе ввода, я использую таблицу Temp.

Моя проблема в том, что если предоставленный столбец имеет дату и время, сортировка не работает. Для других столбцов процедура работает должным образом.

Это код, который я использую.

ALTER PROCEDURE [dbo].[usp_GetEULADetails] 
(
    @OrgKey INT 

    ,@FilterParams FilterTypes READONLY, 
    /*– Sorting Parameters */ 
    @SortColumn nvarchar(20) = 'Status' -- BranchCode 
    ,@SortOrder nvarchar(4) = 'Asc' 

    /*– Pagination Parameters */ 
    ,@PageNumber int = 0 
    ,@PageSize int = 0 


) 

AS 

BEGIN 

SET NOCOUNT ON; 

DECLARE @SortCol nvarchar(20), 
     @FirstRec int, 
     @LastRec int, 
     @TotalRows int, 
     @GlobalSearch nvarchar(100), 
     @EULAVersionNumber nvarchar(100) 

DECLARE @StatusKey INT =(SELECT dbo.GetStatusKey('ACTIVE')) 
DECLARE @RowCountSelected INT 

SELECT 
    @EULAVersionNumber = LTRIM(RTRIM(Value)) 
FROM @FilterParams 
WHERE [FieldName] = 'EULAVersions' 

SELECT 
    @GlobalSearch = LTRIM(RTRIM(Value)) 
FROM @FilterParams 
WHERE [IsGlobal] = 1 

SET @SortCol = LTRIM(RTRIM(@SortColumn)) 
SET @FirstRec = (@PageNumber - 1) * @PageSize 
SET @LastRec = (@PageNumber * @PageSize + 1) 

CREATE TABLE #ResultTempTable (
ROWNUM int 
,ORGKEY int 
,EULAVersionKey int 
,EULAVersionNumber varchar(25) 
,EULAVersionUpdateDate datetime 
,STATUSKEY tinyint 
,DocumentFileName varchar(100) 
,DocumentGUID varchar(100) 
,DocumentTypeName varchar(50) 
,DocumentDescription varchar(128) 
,ContactKey int 
,ContactFirstName varchar(50) 
,ContactMiddleName varchar(50) 
,ContactLastName varchar(50) 
,StatusName varchar(25) 
) 
insert into #ResultTempTable (
     ROWNUM 
     ,ORGKEY 
     ,EULAVersionKey 
     ,EULAVersionNumber 
     ,EULAVersionUpdateDate 
     ,STATUSKEY 
     ,DocumentFileName 
     ,DocumentGUID 
     ,DocumentTypeName 
     ,DocumentDescription 
     ,ContactKey 
     ,ContactFirstName 
     ,ContactMiddleName 
     ,ContactLastName 
     ,StatusName 
) 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY 
     CASE 
     WHEN (@SortCol = 'EULAVersionNumber' AND 
      @SortOrder = 'ASC') THEN V.EULAVersionNumber 
     END ASC, 
     CASE 
     WHEN (@SortCol = 'EULAVersionNumber' AND 
      @SortOrder = 'DESC') THEN V.EULAVersionNumber 
     END DESC, 
     CASE 
     WHEN (@SortCol = 'DocumentFileName' AND 
      @SortOrder = 'ASC') THEN V.DocumentFileName 
     END ASC, 
     CASE 
     WHEN (@SortCol = 'DocumentFileName' AND 
      @SortOrder = 'DESC') THEN V.DocumentFileName 
     END DESC, 
     CASE 
      WHEN (@SortCol = 'EULAVersionUpdateDate' AND 
       @SortOrder = 'ASC') THEN convert(date, V.EULAVersionUpdateDate,103) 
      END ASC, 
     CASE 
      WHEN (@SortCol = 'EULAVersionUpdateDate' AND 
       @SortOrder = 'DESC') THEN convert(date, V.EULAVersionUpdateDate,103) 
      END DESC, 

     CASE 
     WHEN (@SortCol = 'ContactFirstName' AND 
      @SortOrder = 'ASC') THEN V.ContactFirstName 
     END ASC, 
     CASE 
     WHEN (@SortCol = 'ContactFirstName' AND 
      @SortOrder = 'DESC') THEN V.ContactFirstName 
     END DESC, 

     CASE 
     WHEN (@SortCol = 'StatusKey' AND 
      @SortOrder = 'ASC') THEN V.StatusKey 
     END ASC, 
     CASE 
     WHEN (@SortCol = 'StatusKey' AND 
      @SortOrder = 'DESC') THEN V.StatusKey 
     END DESC 

) AS ROWNUM 
    ,[ORGKEY] 
    ,[EULAVersionKey] 
    ,[EULAVersionNumber] 
    ,[EULAVersionUpdateDate] 
    ,[STATUSKEY] 
    ,[DocumentFileName] 
    ,[DocumentGUID] 
    ,[DocumentTypeName] 
    ,[DocumentDescription] 
    ,[ContactKey] 
    ,[ContactFirstName] 
    ,[ContactMiddleName] 
    ,[ContactLastName] 
    ,[StatusName] 

FROM (
     SELECT 
      EUV.[ORGKEY] 
      ,EUV.[EULAVersionKey] 
      ,EUV.[EULAVersionNumber] 
      ,EUV.[EULAVersionUpdateDate] 
      ,EUV.[STATUSKEY] 
      ,DOC.[DocumentFileName] 
      ,DOC.[DocumentGUID] 
      ,DOC.[DocumentDescription] 
      ,DOCTYP.[DocumentTypeName] 
      ,CN.[ContactKey] 
      ,CN.[ContactFirstName] 
      ,CN.[ContactMiddleName] 
      ,CN.[ContactLastName] 
      ,ST.[StatusName] 

     FROM [dbo].[EULAVersions] EUV 
      JOIN [dbo].[Documents] DOC 
       ON DOC.[DocumentKey] =EUV.[DocumentKey] 
      JOIN[dbo].[DocumentTypes] DOCTYP 
       ON DOCTYP.[DocumentTypeKey]=EUV.[DocumentTypeKey] 
      JOIN [dbo].[UserContacts] UC 
       ON UC.[UserKey]=EUv.[EULAVersionUpdatedBy] 
      JOIN [dbo].[Contacts] CN 
       ON CN.[ContactKey]=UC.[ContactKey] 
      JOIN [dbo].[StatusTypes] ST 
       ON ST.[StatusKey]=EUV.[StatusKey] 

     WHERE 
      EUV.[ORGKEY][email protected] --AND EUV.[StatusKey][email protected] 
      AND EUV.[EULAVersionNumber] LIKE '%' + ISNULL(@EULAVersionNumber, EULAVersionNumber) + '%' 
      AND EUV.[EULAVersionNumber] LIKE '%' + ISNULL(@GlobalSearch, EULAVersionNumber) + '%') AS V 

    ) 
IF (@PageNumber <> 0) 
    BEGIN 
     SELECT 
      @TotalRows = COUNT(1) 
     FROM #ResultTempTable AS CPC 
     WHERE ROWNUM BETWEEN @FirstRec AND CASE 
      WHEN @PageNumber = 0 THEN @TotalRows 
      ELSE @LastRec 
     END 

     SELECT 
      [ORGKEY] 
      ,[EULAVersionKey] 
      ,[EULAVersionNumber] 
      ,[EULAVersionUpdateDate] 
      ,[STATUSKEY] 
      ,[DocumentFileName] 
      ,[DocumentGUID] 
      ,[DocumentDescription] 
      ,[DocumentTypeName] 
      ,[ContactFirstName] 
      ,[ContactMiddleName] 
      ,[ContactLastName] 
      ,[StatusName] 

     FROM #ResultTempTable AS CPC 

     WHERE ROWNUM BETWEEN @FirstRec AND CASE 
      WHEN @PageNumber = 0 THEN @TotalRows 
      ELSE @LastRec 
     END 
     ORDER BY ROWNUM ASC 
     END 
     ELSE 
     BEGIN 
     SELECT 
      @TotalRows = COUNT(1) 
     FROM #ResultTempTable AS CPC 


     SELECT 
      [ORGKEY] 
      ,[EULAVersionKey] 
      ,[EULAVersionNumber] 
      ,[EULAVersionUpdateDate] 
      ,[STATUSKEY] 
      ,[DocumentFileName] 
      ,[DocumentGUID] 
      ,[DocumentDescription] 
      ,[DocumentTypeName] 
      ,[ContactFirstName] 
      ,[ContactMiddleName] 
      ,[ContactLastName] 
      ,[StatusName] 

     FROM #ResultTempTable AS CPC 

     ORDER BY ROWNUM ASC 
END 

SELECT @TotalRows AS TotalCount 
    IF OBJECT_ID('tempdb..#ResultTempTable') IS NOT NULL 
    DROP TABLE #ResultTempTable 
END 

--FilterTypes Детали

CREATE TYPE [dbo].[FilterTypes] AS TABLE(
[FieldName] [varchar](100) NOT NULL, 
[Value] [varchar](800) NOT NULL, 
[IsGlobal] [bit] NULL DEFAULT ((0)) 
) 

Sample Exec

declare @FilterParams AS FilterTypes; 
insert into @FilterParams values('EULAVersions','',1) 

exec [usp_GetEULADetails] 2,@FilterParams,'EULAVersionUpdateDate','desc',0,0 

Полученный результат

Unsorted Output for datetime

Ожидаемый результат

declare @FilterParams AS FilterTypes; 
insert into @FilterParams values('EULAVersions','',1) 

exec [usp_GetEULADetails] 2,@FilterParams,'ContactFirstName','desc',0,0 

Sorted Output as expected

вопрос я лицо, как правильно сортировать данные, когда тип данных имеет DateTime?

Спасибо за помощь заранее ....

ответ

1

конвертирование «V.EULAVersionUpdateDate» на сегодняшний день ТипДанный (...THEN convert(date, V.EULAVersionUpdateDate,103)), используйте DATETIME Тип данные для преобразования

THEN convert(DateTime, V.EULAVersionUpdateDate,103) 
+0

Может у пожалуйста, опишите, где я пошло не так? – Bimzee

+0

Внутри Row_Number() ..Order BY ..WHEN (@SortCol = 'EULAVersionUpdateDate' AND @SortOrder = 'ASC') THEN convert (** date **, V.EULAVersionUpdateDate, 103). Изменение типа данных ** дата ** до ** ** DateTime и проверить –

+0

ОК спасибо чувак Он работал .... :) – Bimzee

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