2012-10-12 22 views
1

我正在努力使用大小寫表達式來確定要創建哪個更新語句。下面是甚至可能的,或者我應該爲每個更新單獨更新存儲過程?各種SQL更新的大小寫表達式

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, [email protected], [email protected] 
      where [email protected]_no 
    when 2 then 
      UPDATE warehouse 
      SET pick = @pick, [email protected], [email protected] 
      where [email protected]_no 
    when 0 then 
      UPDATE warehouse 
      SET pick = @pick, endpickdate='', endpicktime='',startpickdate='', startpicktime='' 
      where [email protected]_no 
END 
GO 
+1

您可能想考慮使用IF NOT EXISTS(SELECT從倉庫中選擇WHERE order_no = @order_no和pick = @pick)。 – Fred

+0

哪個DBMS?我假設您的其他問題的SQL Server。 –

回答

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 
+0

完美的作品! – rmon2852

+1

-1 @pick不在(0,1,2)中時語義不同。也可能觸發測試UPDATE('')不必要的觸發器 – RichardTheKiwi

+0

@RichardTheKiwi您是對的,但如果您有可能超出0-2範圍的值,則可以輕鬆添加ELSE情況。我處理的大多數觸發器還檢查插入的值是否與「已刪除」值不同 - 但您確實是這樣,某些觸發器會造成問題。 –

1

CASE不用於T-SQL control-of-flow這種方法是有效的。因此,一種方法是繼續你的IF使用(實際控制的流量),這樣可以讓你保持你的更新語句簡單,雖然會有一個對每個分支:

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, [email protected], [email protected] 
     WHERE [email protected]_no 
    END 
    ELSE IF @pick = 2 BEGIN 
     UPDATE warehouse 
     SET pick = @pick, [email protected], [email protected] 
     WHERE [email protected]_no 
    END 
    ELSE IF @pick = 0 BEGIN 
     UPDATE warehouse 
     SET pick = @pick, endpickdate='', endpicktime='',startpickdate='', startpicktime='' 
     WHERE [email protected]_no 
    END 
END 
GO 

如果您無論如何,你仍然可以在存儲過程中找到它,但這肯定是主觀的。

我可能會傾向於此方法,而不是使用case的一個大組合更新語句,因爲您在每種情況下都更新不同的列。