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 ステートメントを準備できませんでした。メッセージ 125、レベル 15、状態 4、行 1 Case 式は、レベル 10 までのみネストできます。

一部のケースステートメント(通常は10ケース未満)を削除すると正常に機能します。任意の考えや回避策: 私が知っている回避策の 1 つ: リンク サーバーに SP/ビュー/関数を作成し、多くのケース ステートメントを使用して、作成した SP/ビュー/関数を呼び出します。私はこれを探していません。

4

4 に答える 4

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
于 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 に答える