Sql CTE未分类

Sql CTE未分类,sql,sorting,common-table-expression,Sql,Sorting,Common Table Expression,我在使用CTE的存储过程中进行排序时遇到问题。如果我不使用case语句,那么排序工作正常,但我需要能够在四列中的任意一列上进行排序 任何帮助都将不胜感激。下面是所讨论的存储过程的一段 声明@ValuationIds ValuationIdTableType ;WITH CTE AS ( SELECT V.[Id], Registration, (ROW_NUMBER() OVER ( ORDER BY

我在使用CTE的存储过程中进行排序时遇到问题。如果我不使用case语句,那么排序工作正常,但我需要能够在四列中的任意一列上进行排序

任何帮助都将不胜感激。下面是所讨论的存储过程的一段

声明@ValuationIds ValuationIdTableType

    ;WITH CTE
    AS
    (
        SELECT V.[Id], Registration, (ROW_NUMBER() OVER
        (
            ORDER BY  
                CASE WHEN @SortCol='Registration' and @Direction='DESC' then Registration END DESC,
                CASE WHEN @SortCol='Registration' and @Direction='ASC' then Registration END ASC
        )) AS seq 
        FROM [Valuation] V WITH (NOLOCK)
          INNER JOIN dbo.Vehicle a ON a.Id = V.VehicleId
          INNER JOIN dbo.Derivative b on b.Id = a.DerivativeId
          INNER JOIN dbo.Model c on c.Id = b.ModelId
          INNER JOIN dbo.ModelRange d on d.Id = c.ModelRangeId
          INNER JOIN dbo.Manufacturer e on e.Id = d.ManufacturerId
          LEFT JOIN dbo.Disposal f ON f.ValuationId = V.Id            
            CROSS APPLY (
                SELECT TOP 1 *
                FROM dbo.SellerAdvanceValuation savCA
                INNER JOIN udf_SplitIDs(@CentreIdList) IdList 
                ON IdList.EntityID = savCA.CentreId 
                WHERE V.Id = savCA.ValuationId
                ORDER BY Id DESC
            ) sav 
        WHERE [Deleted] = 0
          AND f.Id IS NULL
          AND COALESCE(@Registration, [Registration]) = [Registration]
          AND COALESCE(@VehicleStatusId,[VehicleStatusId] ) = [VehicleStatusId] 
          AND COALESCE(@StartDate,sav.RequestDateTime ) <= sav.RequestDateTime 
          AND sav.RequestDateTime <= COALESCE(@EndDate,sav.RequestDateTime ) 
          AND sav.Amount IS NOT NULL
          AND sav.ValuationDateTime IS NOT NULL
          AND sav.ValuationDateTime > @ValuationExpiryDateTime
    )
    INSERT INTO @ValuationIds(ValuationId)
    SELECT a.Id
    FROM CTE a
    WHERE seq BETWEEN @StartIndex AND (@StartIndex + @MaxRows - 1)

    EXEC dbo.Valuation_Get_All @ValuationIds
更新: 如果我做了下面的工作,它的工作,但我真的不想这样做。我有4列,必须对每列进行升序和降序

DECLARE @ValuationIds ValuationIdTableType

    ;WITH CTE
    AS
    (
        SELECT V.[Id], Registration, (ROW_NUMBER() OVER
        (
            ORDER BY  Registration DESC
                --CASE WHEN @SortCol='Registration' and @Direction='DESC' then Registration END DESC,
                --CASE WHEN @SortCol='Registration' and @Direction='ASC' then Registration END ASC
        )) AS seq 
        FROM [Valuation] V WITH (NOLOCK)
          INNER JOIN dbo.Vehicle a ON a.Id = V.VehicleId
          INNER JOIN dbo.Derivative b on b.Id = a.DerivativeId
          INNER JOIN dbo.Model c on c.Id = b.ModelId
          INNER JOIN dbo.ModelRange d on d.Id = c.ModelRangeId
          INNER JOIN dbo.Manufacturer e on e.Id = d.ManufacturerId
          LEFT JOIN dbo.Disposal f ON f.ValuationId = V.Id            
            CROSS APPLY (
                SELECT TOP 1 *
                FROM dbo.SellerAdvanceValuation savCA
                INNER JOIN udf_SplitIDs(@CentreIdList) IdList 
                ON IdList.EntityID = savCA.CentreId 
                WHERE V.Id = savCA.ValuationId
                ORDER BY Id DESC
            ) sav 
        WHERE [Deleted] = 0
          AND f.Id IS NULL
          AND COALESCE(@Registration, [Registration]) = [Registration]
          AND COALESCE(@VehicleStatusId,[VehicleStatusId] ) = [VehicleStatusId] 
          AND COALESCE(@StartDate,sav.RequestDateTime ) <= sav.RequestDateTime 
          AND sav.RequestDateTime <= COALESCE(@EndDate,sav.RequestDateTime ) 
          AND sav.Amount IS NOT NULL
          AND sav.ValuationDateTime IS NOT NULL
          AND sav.ValuationDateTime > @ValuationExpiryDateTime
    )
    INSERT INTO @ValuationIds(ValuationId)
    SELECT a.Id
    FROM CTE a
    WHERE seq BETWEEN @StartIndex AND (@StartIndex + @MaxRows - 1)

    EXEC dbo.Valuation_Get_All @ValuationIds

插入@ValuationIdsValuationId 选择a.Id 来自CTE a 其中@StartIndex和@StartIndex+@MaxRows-1之间的seq 按{ColumnFromInCTE}排序


你说的分拣工作是什么意思?唯一的order by在row_number语句中。如果没有排序,那么可能变量设置不正确。如果我按注册描述排序,那么它会工作。当我使用case语句时,它不正确,你是对的。这是参数。像木偶一样,我将参数@Direction声明为varchar3而不是varchar4。哦,这是漫长的一天。感谢您的见解。除非我误解了CTE,否则我不必在您提到的“从CTE中选择”部分下订单,因为我已经在CTE中对其进行排序。问题在于案例陈述根本不起作用。我快发疯了,因为你什么都不分类。您正在创建一个名为seq的字段,但没有将其用于排序。您可以按seq将其添加到@evaluationexpirydatetime过滤器顺序之后,或者在我前面提到的地方,实际上,代码还可以。参数声明是错误的。我错误地将varchar3而不是varchar4放在了一起,因此当我尝试按降序排序时,它将不起作用。选择CTE时不需要指定排序,因为排序应用于CTE本身。