1

どの更新ステートメントを作成するかを決定するためにケース式に苦労しています。以下は可能ですか、または更新ごとに個別の更新ストアドプロシージャを作成する必要がありますか?

 IF (SELECT pick FROM warehouse WHERE order_no = @order_no and pick = @pick) is null
    CASE @pick 
    when 1 then
            UPDATE warehouse
            SET pick = @pick, startpickdate=@dchar, startpicktime=@tchar
            where order_no=@order_no
    when 2 then
            UPDATE warehouse
            SET pick = @pick, endpickdate=@dchar, endpicktime=@tchar
            where order_no=@order_no
    when 0 then
            UPDATE warehouse
            SET pick = @pick, endpickdate='', endpicktime='',startpickdate='', startpicktime=''
            where order_no=@order_no
END
GO
4

2 に答える 2

1

列を条件付きで更新する場合は、このアプローチが適しています

UPDATE Warehouse
SET Pick = @pick
   , startPickDate = CASE @pick
                        WHEN 1 THEN @dchar
                        WHEN 2 THEN startPickDate
                        WHEN 0 THEN ''
                     END
   , startPickTime = CASE @pick
                        WHEN 1 THEN @tchar
                        WHEN 2 THEN startPickTime
                        WHEN 0 THEN ''
                     END
   , ...
WHERE order_no = @order_no
于 2012-10-12T15:49:50.683 に答える
1

CASET-SQL control-of-flow には使用されません。そのため、1 つの方法はIF(実際のフロー制御) の使用を継続することです。これにより、更新ステートメントをよりシンプルに保つことができますが、ブランチごとに 1 つ存在します。

IF (SELECT pick FROM warehouse WHERE order_no = @order_no AND pick = @pick) IS NULL BEGIN
    IF @pick = 1 BEGIN
        UPDATE warehouse
        SET pick = @pick, startpickdate=@dchar, startpicktime=@tchar
        WHERE order_no=@order_no
    END
    ELSE IF @pick = 2 BEGIN
        UPDATE warehouse
        SET pick = @pick, endpickdate=@dchar, endpicktime=@tchar
        WHERE order_no=@order_no
    END
    ELSE IF @pick = 0 BEGIN
        UPDATE warehouse
        SET pick = @pick, endpickdate='', endpicktime='',startpickdate='', startpicktime=''
        WHERE order_no=@order_no
    END
END
GO

とにかくストアド プロシージャを使用している場合、これはより保守しやすいと思うかもしれませんが、それは確かに主観的です。

caseそれぞれの場合で異なる列を更新しているため、1 つの大きな結合された update ステートメントを使用するよりも、おそらくこの方法に傾倒するでしょう。

于 2012-10-12T15:55:14.143 に答える