0

CTEを使用してページングクエリを作成しようとしています。Microsoft SQL ServerManagementStudioクエリエディターから実行すると正常に動作します。そして、結果セットは私が望むように完全にソートされます。しかし、ストアドプロシージャ用に変更すると、並べ替えられていない結果が得られ、その理由がわかりません。

これが私のクエリです、

with items as
(
select ROW_NUMBER() over (order by create_time desc) number
    , i.item_name item_name
    , i.create_time create_time
    , c.category_name category_name
    , i.category_id category_id
from cb_item i, cb_category c
where i.category_id = c.category_id
and c.category_id = '4E5248FE-05DD-4D01-ABBB-80C6E3BA5CDA' 
)
select item_name
, create_time
, category_name
, category_id
from items
where number between 1 and 25

そして、これはストアドプロシージャバージョンです。

    create procedure ItemPage @category_id uniqueidentifier
    , @from int
    , @to int
    , @sortby nvarchar(50)
    as
    begin
    with items as
    (
    select ROW_NUMBER() over (order by @sortby) number
        , i.item_name item_name
        , i.create_time create_time
        , c.category_name category_name
        , i.category_id category_id
    from cb_item i, cb_category c
    where i.category_id = c.category_id
    and c.category_id = @category_id 
    )
    select item_name
    , create_time
    , category_name
    , category_id
    from items
    where number between @from and @to
    end


exec itempage '4E5248FE-05DD-4D01-ABBB-80C6E3BA5CDA' , 1, 25, 'create_time desc'

最初のものは私にソートされた結果を与えますが、プロシージャは私にソートされていない結果を与えます。どうしてか分かりません?

4

1 に答える 1

0

渡された値を確認し、それに応じて行ごとに並べ替えることができるステートメントごとにケースを使用する必要があります。

クエリは次のようになります。

 create procedure ItemPage @category_id uniqueidentifier
        , @from int
        , @to int
        , @sortby nvarchar(50)
        as
        begin
        with items as
        (
        select ROW_NUMBER() over (order by
                                    CASE @sortby
                                    WHEN 'create_time desc' THEN  create_time -- Here, I assume passed @sortby value is create_time , otherwise you can mapped with passed value
                                    END
                                    DESC,
                                    CASE @sortby
                                    WHEN 'create_time asc' THEN  create_time -- Here, I assume passed @sortby value is create_time , otherwise you can mapped with passed value
                                    END
                                    ASC
                                    ) number
            , i.item_name item_name
            , i.create_time create_time
            , c.category_name category_name
            , i.category_id category_id
        from cb_item i, cb_category c
        where i.category_id = c.category_id
        and c.category_id = @category_id 
        )
        select item_name
        , create_time
        , category_name
        , category_id
        from items
        where number between @from and @to
        end
于 2012-10-07T08:57:54.993 に答える