使用临时表在存储过程中的日期时间上对行进行排序

比姆泽

我有一个存储过程,该过程从多个表中选择数据(使用联接),并根据提供的列以排序顺序(asc或desc)返回数据。

为了根据输入生成排序结果,我使用了一个临时表。

我的问题是,当提供的列为日期时间时,则排序不起作用。对于其他列,该过程将按预期工作。

这是我使用的代码。

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]=@OrgKey --AND EUV.[StatusKey]=@StatusKey
            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))
)

样本执行

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

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

取得结果

日期时间的未分类输出

预期结果

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

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

按预期对输出进行排序

我面临的问题是,当数据类型为datetime时如何正确地对数据进行排序?

我在这里先向您的帮助表示感谢....

阿卜杜勒·拉希德(Abdul Rasheed)

您正在将'V.EULAVersionUpdateDate'转换为日期DataType(...THEN convert(date, V.EULAVersionUpdateDate,103)),请使用DATETIME数据类型进行转换

THEN convert(DateTime, V.EULAVersionUpdateDate,103)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用临时表在存储过程中的日期时间上对行进行排序

来自分类Dev

在存储过程中的动态SQL中使用临时表

来自分类Dev

无法在Oracle中的存储过程中创建临时表

来自分类Dev

在SQL Server 2008中的存储过程中使用的临时表,表变量,全局临时表之间的差异

来自分类Dev

在存储过程中向临时表添加行号

来自分类Dev

在嵌套存储过程中创建重复的临时表

来自分类Dev

尝试在存储过程中创建临时表

来自分类Dev

db2 存储过程中的全局临时表

来自分类Dev

在存储过程中创建和使用的SQL Server中的临时表

来自分类Dev

使用存储过程中的“标识”列插入到临时表中

来自分类Dev

使用IF语句检查临时表在存储过程中是否有行

来自分类Dev

为什么Firebird的存储过程中不允许使用临时表?

来自分类Dev

是否可以在存储过程中创建本地临时表并在存储过程返回后继续使用它?

来自分类Dev

SQL Server:从调用其他存储过程的存储过程中捕获临时表

来自分类Dev

如何在日期时间存储过程中使用BETWEEN

来自分类Dev

MySQL 5.7,使用存储过程中的变量按列名对表进行排序

来自分类Dev

在PL / pgSQL中声明存储过程中临时表的变量

来自分类Dev

使用存储过程中的数据进行子报表

来自分类Dev

存储过程中的临时表将导致重新编译执行计划

来自分类Dev

在此SQL存储过程中真的需要临时表吗?

来自分类Dev

插入临时表在mysql存储过程中不起作用

来自分类Dev

在存储过程中将临时表与exec @sql一起使用

来自分类Dev

在存储过程中使用具有相同名称的临时表

来自分类Dev

在存储过程中使用具有相同名称的临时表

来自分类Dev

存储过程中的排序规则问题

来自分类Dev

存储过程中的排序规则问题

来自分类Dev

使用由存储的过程填充的临时表中的列

来自分类Dev

如何使用存储的MYSQL过程中的表输出

来自分类Dev

使用变量输入联接存储过程中的表

Related 相关文章

  1. 1

    使用临时表在存储过程中的日期时间上对行进行排序

  2. 2

    在存储过程中的动态SQL中使用临时表

  3. 3

    无法在Oracle中的存储过程中创建临时表

  4. 4

    在SQL Server 2008中的存储过程中使用的临时表,表变量,全局临时表之间的差异

  5. 5

    在存储过程中向临时表添加行号

  6. 6

    在嵌套存储过程中创建重复的临时表

  7. 7

    尝试在存储过程中创建临时表

  8. 8

    db2 存储过程中的全局临时表

  9. 9

    在存储过程中创建和使用的SQL Server中的临时表

  10. 10

    使用存储过程中的“标识”列插入到临时表中

  11. 11

    使用IF语句检查临时表在存储过程中是否有行

  12. 12

    为什么Firebird的存储过程中不允许使用临时表?

  13. 13

    是否可以在存储过程中创建本地临时表并在存储过程返回后继续使用它?

  14. 14

    SQL Server:从调用其他存储过程的存储过程中捕获临时表

  15. 15

    如何在日期时间存储过程中使用BETWEEN

  16. 16

    MySQL 5.7,使用存储过程中的变量按列名对表进行排序

  17. 17

    在PL / pgSQL中声明存储过程中临时表的变量

  18. 18

    使用存储过程中的数据进行子报表

  19. 19

    存储过程中的临时表将导致重新编译执行计划

  20. 20

    在此SQL存储过程中真的需要临时表吗?

  21. 21

    插入临时表在mysql存储过程中不起作用

  22. 22

    在存储过程中将临时表与exec @sql一起使用

  23. 23

    在存储过程中使用具有相同名称的临时表

  24. 24

    在存储过程中使用具有相同名称的临时表

  25. 25

    存储过程中的排序规则问题

  26. 26

    存储过程中的排序规则问题

  27. 27

    使用由存储的过程填充的临时表中的列

  28. 28

    如何使用存储的MYSQL过程中的表输出

  29. 29

    使用变量输入联接存储过程中的表

热门标签

归档