Sql-Server
如何使用超過 10 個條件的 CASE 語句更新列
我正在嘗試使用 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 級”。
這裡有兩種可能。
- 連結伺服器存在一個限制,即在使用
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 個更多的分支。您應該嘗試它,然後用您的實際程式碼和您收到的任何實際錯誤報告回來。