3
Select distinct 
    Case 
        When ABC = 'C1' then 'C1'
        When ABC = 'C1C' then 'C1C' 
        When ABC = 'C2' then 'C2' 
        When ABC = 'C3' then 'C3'
        When ABC = 'C3C' then 'C3C' 
        When ABC = 'C3CC' then  'C3CC'
        When ABC = 'C4' then 'C4' 
        When ABC = 'C4C' then  'C4C'
        When ABC = 'C4CC' then 'C4CC' 
        When ABC = 'C6' then  'C6'
        When ABC = 'C7' then  'C7'
        When ABC = 'C8' then  'C8'
        When ABC = 'F' then  'F'
        When ABC = 'F2' then 'F2'
        When ABC = 'V' then 'V'
        When ABC = 'V2' then 'V2'
    End as ABC
from LinkedServer.database.dbo.Tblname

当我在常规数据库上执行上述 sql 时,可以完美运行,没有错误,但是如果我使用链接服务器前缀,那么我会得到以下错误。

错误消息:消息 8180,级别 16,状态 1,行 1 无法准备语句。Msg 125, Level 15, State 4, Line 1 Case 表达式只能嵌套到级别 10。

如果我删除一些案例语句(通常少于 10 个案例)工作正常,它工作正常。任何想法或解决方法:我知道的一种解决方法:使用许多案例语句在链接服务器上创建 SP/View/Function,然后调用创建的 SP/View/Function。我不是在寻找这个。

4

4 回答 4

1

你的case也可以写

Case When ABC IN ('C1','C1C','C2'...) then ABC End as ABC

如果您使用的 CASE 语句具有大量内置的描述翻译,那么您做错了。您应该改为创建查找表并执行 LEFT JOIN。查找表可以存在于链接服务器的任一侧。

select
    l.description as abc
    ...
from LinkedServer.database.dbo.Tblname t
left join ABCValues l on t.ABC = l.value
于 2012-12-05T22:29:15.087 回答
1

when无论出于何种原因,您在这样的case声明中不能超过 10个。

在你的情况下,很容易用一个in子句来修复:

case when ABC in ('C1', . . . ) then ABC
end

如果您的 SQL 代码更复杂,那么您可以使用映射表并连接:

with mapping as (
    select 'C1' as val, 'C1' as newval union all
    . . .
)
select m.newval, . . .
from LinkedServer.database.dbo.Tblname t left outer join
     mapping m
     on t.ABC = m.val
于 2012-12-05T22:30:00.483 回答
1

代替 LINKEDSERVER.DB.dbo.Table,您可以使用 OPENQUERY 并且没有遇到此 CASE 限制

于 2014-02-12T00:08:47.623 回答
0

正如 Steven 提到的,尽可能使用 OPENQUERY。

SELECT ABC 
FROM OPENQUERY(LinkedServer,
'Select distinct 
    Case 
        When ABC = ''C1'' then ''C1 or whatever''
        When ABC = ''C1C'' then ''C1C blabla '' 
        When ABC = ''C2'' then ''C2'' 
        When ABC = ''C3'' then ''C3''
        When ABC = ''C3C'' then ''C3C'' 
        When ABC = ''C3CC'' then  ''C3CC''
        When ABC = ''C4'' then ''C4'' 
        When ABC = ''C4C'' then  ''C4C''
        When ABC = ''C4CC'' then ''C4CC'' 
        When ABC = ''C6'' then  ''C6''
        When ABC = ''C7'' then  ''C7''
        When ABC = ''C8'' then  ''C8''
        When ABC = ''F'' then  ''F''
        When ABC = ''F2'' then ''F2''
        When ABC = ''V'' then ''V''
        When ABC = ''V2'' then ''V2''
    End as ABC
from database.dbo.Tblname')
于 2021-06-11T15:54:23.400 回答