1

ユニオンで結合された 3 つのクエリで構成されるストアド プロシージャがあります。これは機能します。現在、次のような値セットによる順序があります。

    ORDER BY [CategoryTypeID], [SortOrder], [Name]

これを動的にしたいので、次のようなケースステートメントを使用してみました:

    ORDER BY CASE WHEN @sort = 0 then [CategoryTypeID] ELSE [SortOrder] end

ただし、このSQLを実行すると、ステートメントにユニオンが含まれている場合、アイテムによる順序が選択リストに表示される必要があると不平を言います...など

ただし、パラメーターの使用を避けるために上記を変更すると、次のようになります。

ORDER BY CASE WHEN 0 = 0 then [CategoryTypeID] ELSE [SortOrder] end

それはうまくいきます。パラメータが実際に使用されていないときにパラメータを使用すると、なぜ不幸になるのですか? selectステートメントにパラメーターを含めようとしましたが、それでも同じエラーが発生しました。

case @sort when 1 なども試しましたが、同じ結果が得られました。そして、ストアド プロシージャでパラメータを宣言しました - @sort int = 0

これは MSSQL 2012 エクスプレスです。

編集 - 明確にするために

 ORDER BY CASE WHEN @sort = 0 then [SortOrder] ELSE [CategoryTypeID] end

ORDER BY CASE WHEN @sort = 0 then [CategoryTypeID] ELSE [CategoryTypeID] end

これらのステートメントは両方とも、「選択リストに表示する必要があります」というエラーで失敗します。そして、私はこれらのステートメントの両方を同時に使用しようとしていませんでした。列自体が問題にならないように例として挙げるだけです。パラメータ自体が選択されていないか、ソートされていないにもかかわらず、問題と思われるパラメータを使用しています。

4

2 に答える 2

4

CASE WHEN 0 = 0 then [CategoryTypeID] ELSE [SortOrder] endコンパイル時に解決され、単純化されますCategoryTypeID

できるよ

WITH T
     AS (SELECT [CategoryTypeID],
                [SortOrder]
         FROM   T1
         UNION
         SELECT [CategoryTypeID],
                [SortOrder]
         FROM   T2)
SELECT *
FROM   T
ORDER  BY CASE
            WHEN @sort = 0 THEN [CategoryTypeID]
            ELSE [SortOrder]
          END 

または

SELECT [CategoryTypeID],
       [SortOrder],
       CASE
         WHEN @sort = 0 THEN [CategoryTypeID]
         ELSE [SortOrder]
       END AS S
FROM   T1
UNION
SELECT [CategoryTypeID],
       [SortOrder],
       CASE
         WHEN @sort = 0 THEN [CategoryTypeID]
         ELSE [SortOrder]
       END AS S
FROM   T2
ORDER  BY S 
于 2013-06-03T19:49:28.643 に答える