如何使用具有 10 个以上条件的 CASE 语句更新列

Boj*_*uai -1 sql-server case update sql-server-2016

我正在尝试使用 CASE 语句更新 SQL Server 2016 中的列,因为我必须根据不同的条件更改值。问题是我有超过 10 个条件,而且 SQL Server 似乎最多只允许 10 个条件级别。那么我该怎么做呢?这是我试图做的:

UPDATE my_table  
SET my_column = CASE 
    WHEN condition1 THEN expression1  
    WHEN condition2 THEN expression2  ...
Run Code Online (Sandbox Code Playgroud)

不是链接服务器,我还没有尝试在CASE表达式中放入 11 个条件。如果您查看文档,您会发现“SQL Server 仅允许在CASE表达式中进行 10 级嵌套”。

Aar*_*and 13

这里有两种可能。

  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;
    
    Run Code Online (Sandbox Code Playgroud)

    这导致以下错误消息:


    无法准备消息 8180,级别 16,状态 1 语句。
    消息 125,级别 15,状态 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;
    
    Run Code Online (Sandbox Code Playgroud)

    第二种可能性是在链接服务器上创建一个存储过程,并调用它。只有通过链接服务器发送原始查询时,您才会遇到此限制(将来,请提供问题中的所有相关信息,例如您收到的实际错误消息以及您使用链接服务器的事实)。

  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;
    
    Run Code Online (Sandbox Code Playgroud)

    这就是文档中CASE表达式“嵌套”的含义,并将导致此错误消息:

    消息 125,级别 15,状态 4
    Case 表达式只能嵌套到级别 10。

当您不处理链接服务器或实际嵌套时,简单/搜索CASE表达式可以有比 10 个更多的分支。您应该尝试它,然后报告您的实际代码和您收到的任何实际错误。