1

INSERT ステートメントで機能するクエリがありますが、スタンドアロンとしては機能しません。私の人生では、その理由を理解できません。動作するコードは次のとおりです。

declare @FY1 char(4)
set @FY1 = (DATEPART(yy,DATEADD(m,-2,GETDATE()) ))
declare @fy char(2)
set @fy = SUBSTRING(@fy1,3,2)
declare @MonthUnits char (2)
set @MonthUnits = datepart(mm, dateadd(mm, -2, getdate()))

create table #tmpJDEnbrunits (mcmcu char(12)
        , NbrUnits float
        , mcdl02 char(40))
insert into #tmpJDEnbrunits
select '000' + ltrim(MCMCU)
, CASE @MonthUnits 
WHEN  1 THEN GBAN01/100 -- January
WHEN  2 THEN GBAN02/100 -- February
WHEN  3 THEN GBAN03/100 -- March
WHEN  4 THEN GBAN04/100 -- April
WHEN  5 THEN GBAN05/100 -- May
WHEN  6 THEN GBAN06/100 -- June
WHEN  7 THEN GBAN07/100 -- July
WHEN  8 THEN GBAN08/100 -- August
WHEN  9 THEN GBAN09/100 -- September
WHEN 10 THEN GBAN10/100 -- October
WHEN 11 THEN GBAN11/100 -- November
WHEN 12 THEN GBAN12/100 -- December
  END
, mcdl02 
from [JDEPSQL1\JDEProd].JDE_PRODUCTION.PRODDTA.F0902, 
[JDEPSQL1\JDEProd].JDE_PRODUCTION.PRODDTA.F0006 
where GBMCU = MCMCU and 
GBFY = @fy and GBLT = 'AU' and
GBOBJ = '9900' and GBSUB = '006' and
MCSTYL in ('R') AND MCMCU<'         999' AND 
MCRP22<>'X'

select * from #tmpJDEnbrunits
where NbrUnits > 0

しかし、次のように、CASE を使用して SELECT のみを実行して一時テーブルを削除しようとすると、次のようになります。

declare @FY1 char(4)
set @FY1 = (DATEPART(yy,DATEADD(m,-2,GETDATE()) ))
declare @fy char(2)
set @fy = SUBSTRING(@fy1,3,2)
declare @MonthUnits char (2)
set @MonthUnits = datepart(mm, dateadd(mm, -2, getdate()))

select '000' + ltrim(MCMCU)
, CASE @MonthUnits 
    WHEN  1 THEN GBAN01/100 -- January
    WHEN  2 THEN GBAN02/100 -- February
    WHEN  3 THEN GBAN03/100 -- March
    WHEN  4 THEN GBAN04/100 -- April
    WHEN  5 THEN GBAN05/100 -- May
    WHEN  6 THEN GBAN06/100 -- June
    WHEN  7 THEN GBAN07/100 -- July
    WHEN  8 THEN GBAN08/100 -- August
    WHEN  9 THEN GBAN09/100 -- September
    WHEN 10 THEN GBAN10/100 -- October
    WHEN 11 THEN GBAN11/100 -- November
    WHEN 12 THEN GBAN12/100 -- December
  END
, mcdl02 
from [JDEPSQL1\JDEProd].JDE_PRODUCTION.PRODDTA.F0902, 
[JDEPSQL1\JDEProd].JDE_PRODUCTION.PRODDTA.F0006 
where GBMCU = MCMCU and 
GBFY = @fy and GBLT = 'AU' and
GBOBJ = '9900' and GBSUB = '006' and
MCSTYL in ('R') AND MCMCU<'         999' AND 
MCRP22<>'X'

次のエラーが表示されます。

Msg 8180, Level 16, State 1, Line 1 
Statement(s) could not be prepared.
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Qry1043'.
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Qry1016'.
Msg 125, Level 15, State 4, Line 1
Case expressions may only be nested to level 10.

CASE ステートメントにはネストがないため、最後のステートメントは特に奇妙です。助けていただければ幸いです。1時間グーグルで検索しましたが、運が悪かったです。

編集: 文字通り、WHEN がネストされた CASE ステートメントであると考えているようです。そのうちの 2 つをコメントアウトすると、エラーなしで実行されます。

4

2 に答える 2

1

ここで奇妙な自動変換を使用しているか、実際のコードではありません。それがあなたのコードである場合は、これを実行して、文字列を文字列と比較します(文字列と数値ではありません):

CASE @MonthUnits 
    WHEN '01' THEN GBAN01/100 -- January
    WHEN '02' THEN GBAN02/100 -- February
    WHEN '03' THEN GBAN03/100 -- March
    WHEN '04' THEN GBAN04/100 -- April
    WHEN '05' THEN GBAN05/100 -- May
    WHEN '06' THEN GBAN06/100 -- June
    WHEN '07' THEN GBAN07/100 -- July
    WHEN '08' THEN GBAN08/100 -- August
    WHEN '09' THEN GBAN09/100 -- September
    WHEN '10' THEN GBAN10/100 -- October
    WHEN '11' THEN GBAN11/100 -- November
    WHEN '12' THEN GBAN12/100 -- December
  END

また、本当に数値が必要な場合は、組み込み関数 MONTH を使用できます

declare @MonthUnits int
set @MonthUnits = month(dateadd(mm, -2, getdate())

わきに

コードが実際に次のようになっている場合、正確なエラー メッセージが表示されると思います。

CASE @MonthUnits 
    CASE WHEN '01' THEN GBAN01/100 -- January
    CASE WHEN '02' THEN GBAN02/100 -- February
    CASE WHEN '03' THEN GBAN03/100 -- March
    CASE WHEN '04' THEN GBAN04/100 -- April
    CASE WHEN '05' THEN GBAN05/100 -- May
    CASE WHEN '06' THEN GBAN06/100 -- June
    CASE WHEN '07' THEN GBAN07/100 -- July
    CASE WHEN '08' THEN GBAN08/100 -- August
    CASE WHEN '09' THEN GBAN09/100 -- September
    CASE WHEN '10' THEN GBAN10/100 -- October
    CASE WHEN '11' THEN GBAN11/100 -- November
    CASE WHEN '12' THEN GBAN12/100 -- December
  END

ここでは、多くの case ステートメントが開始 (ネスト) されており、ケースの end ステートメントはありません。

于 2013-09-19T16:53:28.713 に答える
1

このコードを試して、

CASE 
    WHEN  @MonthUnits = '1' THEN GBAN01/100 -- January
    WHEN  @MonthUnits = '2' THEN GBAN02/100 -- February
    WHEN  @MonthUnits = '3' THEN GBAN03/100 -- March
    WHEN  @MonthUnits = '4' THEN GBAN04/100 -- April
    WHEN  @MonthUnits = '5' THEN GBAN05/100 -- May
    WHEN  @MonthUnits = '6' THEN GBAN06/100 -- June
    WHEN  @MonthUnits = '7' THEN GBAN07/100 -- July
    WHEN  @MonthUnits = '8' THEN GBAN08/100 -- August
    WHEN  @MonthUnits = '9' THEN GBAN09/100 -- September
    WHEN @MonthUnits = '10' THEN GBAN10/100 -- October
    WHEN @MonthUnits = '11' THEN GBAN11/100 -- November
    WHEN @MonthUnits = '12' THEN GBAN12/100 -- December
  END

「Case 式はレベル 10 までしか入れ子にできない」というメッセージは表示されません。エラー

于 2013-09-19T17:54:49.320 に答える