在链接服务器中使用Case语句

时间:2012-12-05 22:23:09

标签: sql sql-server sql-server-2008 sql-server-2005

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。我不是在寻找这个。

4 个答案:

答案 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')