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
这里有两种可能。
链接服务器有一个限制,即在使用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)
第二种可能性是在链接服务器上创建一个存储过程,并调用它。只有通过链接服务器发送原始查询时,您才会遇到此限制(将来,请提供问题中的所有相关信息,例如您收到的实际错误消息以及您使用链接服务器的事实)。
您的实际查询与您在问题中的建议不同,看起来更像是这样:
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 个更多的分支。您应该尝试它,然后报告您的实际代码和您收到的任何实际错误。