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时,完美没有错误但是 如果我使用链接服务器前缀,那么我会得到以下错误。
错误消息:Msg 8180,Level 16,State 1,Line 1 Statement(s)可以 不准备。消息125,级别15,状态4,行1个案例表达式 可能只能嵌套到10级。
如果删除一些case语句(通常少于10个),它可以正常工作。 任何想法或解决方法: 我知道一个解决方法:在链接服务器上使用多个case语句创建SP / View / Function,然后调用创建的SP / View / Function。我不是在寻找这个。
答案 0 :(得分:1)
你的案子也可以写
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
答案 1 :(得分: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
答案 2 :(得分:0)
代替LINKEDSERVER.DB.dbo.Table,您可以使用OPENQUERY并且没有遇到此CASE限制
答案 3 :(得分: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')