0

次の SQL Server ストアド プロシージャを実行しようとしていますが、実行できません。プロシージャ クエリは次のとおりです。

ALTER PROCEDURE [dbo].[get_StockNavigationReportData]
    @startDate VARCHAR(200),
    @endDate VARCHAR(200),
    @groupBy VARCHAR(200)
AS
BEGIN
    SELECT M.VRNOA, M.VRDATE 'DATE', M.REMARKS, D.qty 'QTY', g2.name 'Godown_2', g.name 'Godown_1'
    FROM 
        Stockmain M, StockDetail D, GODOWN G,   (
            SELECT * FROM GODOWN
        ) AS g2
    WHERE 
            M.Etype='navigation' 
        AND M.STID = D.STID
        AND D.GODOWN_ID = G.GODOWN_ID 
        AND g2.godown_id = D.GODOWN_ID2
        AND VRDATE  BETWEEN CONVERT(VARCHAR, CAST(@startDate AS DATETIME),101)
        AND CONVERT(VARCHAR, CAST(@endDate AS DATETIME), 101)   
    ORDER BY 
        @groupBy ASC
END

そして、私が得るエラーは次のとおりです。

メッセージ 1008、レベル 16、状態 1、手順 get_StockNavigationReportData、行 25
ORDER BY 番号 1 で識別される SELECT 項目には、列の位置を識別する式の一部として変数が含まれています。変数は、列名を参照する式で順序付けする場合にのみ許可されます。

誰でも見て、私がここで間違っていることを教えてもらえますか+どうすればこれを機能させることができますか?

4

3 に答える 3

5

order by節で変数を使用することはできません。代わりに、次のようにする必要があります。

order by (case when @groupBy = 'VRNOA' then VRNOA
               . . .
          end)

ただし、列の型が異なると、予期しないことが発生したり、別のエラーが発生したりする可能性があるため、注意してください。(動的 SQL を使用する別の方法もありますが、お勧めしません。)

また、名前@groupbyが少し紛らわしいです。「グループ化」は、「集計」に相当する SQL 用語です。より適切ではないでしょう@OrderByか?@SortBy

于 2013-09-16T12:01:58.863 に答える
2

そのように変数で注文することはできません。

それを行う場合は、動的クエリ文字列を作成してから実行します。

何かのようなもの:

declare @sql varchar(4000)

set @sql = 'select * from tablename order by ' + @orderbyclause + ' ASC'
exec (@sql)
于 2013-09-16T12:02:15.593 に答える
1

はい、順序位置を指定する order by 句で変数を使用することはできません。 http://exacthelp.blogspot.com/2012/03/how-to-use-variable-in-order-by-clause.html

次のように書く必要があります。

ORDER BY 
        CASE 
WHEN @groupBy = 1 THEN VRNOA
WHEN @groupBy = 2 THEN DATE
WHEN @groupBy = 3 THEN REMARKS
...............
............
END
于 2013-09-16T12:08:49.347 に答える