Sql-Server

如何使用超過 10 個條件的 CASE 語句更新列

  • November 7, 2016

我正在嘗試使用 CASE 語句更新 SQL Server 2016 中的列,因為我必鬚根據不同的條件更改值。問題是我有超過 10 個條件,似乎 SQL Server 最多只允許 10 個級別的條件。那麼我該怎麼做呢?這是我想做的事情:

UPDATE my_table  
SET my_column = CASE 
   WHEN condition1 THEN expression1  
   WHEN condition2 THEN expression2  ...

不是連結伺服器,我沒有嘗試在CASE表達式中放置 11 個條件。如果您查看文件,您會發現“SQL Server 只允許在CASE表達式中嵌套 10 級”。

這裡有兩種可能。

  1. 連結伺服器存在一個限制,即在使用CASE表達式時只允許嵌套級別為 10。我想您正在使用連結伺服器,但已將其簡化為遠離您的問題。你可能有這樣的程式碼:
UPDATE LinkedServer.database.dbo.table
 SET col = CASE 
   WHEN cond1  THEN expr1
   WHEN cond2  THEN expr2
   WHEN cond3  THEN expr3
   WHEN cond4  THEN expr4
   WHEN cond5  THEN expr5
   WHEN cond6  THEN expr6
   WHEN cond7  THEN expr7
   WHEN cond8  THEN expr8
   WHEN cond9  THEN expr9
   WHEN cond10 THEN expr10
   WHEN cond11 THEN expr11
END;

這導致以下錯誤消息:

消息 8180,級別 16,狀態 1

聲明無法準備。

Msg 125, Level 15, State 4

Case 表達式只能嵌套到級別 10。

一種解決方法是使用動態 SQL(或者也許OPENQUERY):

DECLARE @sql nvarchar(max) = N'UPDATE dbo.table 
 SET col = CASE
   WHEN cond1 ...
   ...
 END;';

EXEC LinkedServer.database.sys.sp_executesql @sql;

第二種可能性是在連結伺服器上創建一個儲存過程,然後呼叫它。只有通過連結伺服器發送原始查詢時,您才會遇到此限制(將來,請在問題中提供所有相關資訊,例如您收到的實際錯誤消息以及您正在使用連結伺服器的事實)。 2. 您的實際查詢與您在問題中建議的不同,它看起來更像這樣:

UPDATE dbo.table SET col = 
CASE WHEN cond1  THEN expr1  ELSE 
 CASE WHEN cond2  THEN expr2  ELSE 
  CASE WHEN cond3  THEN expr3  ELSE 
   CASE WHEN cond4  THEN expr4  ELSE 
    CASE WHEN cond5  THEN expr5  ELSE 
     CASE WHEN cond6  THEN expr6  ELSE 
      CASE WHEN cond7  THEN expr7  ELSE 
       CASE WHEN cond8  THEN expr8  ELSE 
        CASE WHEN cond9  THEN expr9  ELSE 
         CASE WHEN cond10 THEN expr10 ELSE 
          CASE WHEN cond11 THEN expr11 ELSE 
END END END END END END END END END END END;

這就是文件“嵌套”CASE表達式的含義,並會導致此錯誤消息:

Msg 125, Level 15, State 4

Case 表達式只能嵌套到級別 10。

當您不處理連結伺服器或實際嵌套時,一個簡單/搜尋的CASE表達式可能有比 10 個更多的分支。您應該嘗試它,然後用您的實際程式碼和您收到的任何實際錯誤報告回來。

引用自:https://dba.stackexchange.com/questions/154080