У меня есть запрос, который работает в инструкции INSERT, но не как самостоятельный, и для жизни меня я не могу понять, почему. Вот код, который работает:Ошибка CASE в MS SQL Server 2008 R2
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
Но когда я пытаюсь запустить только ВЫБРАТЬ с ДЕЛОМ устранить временную таблицу, как это:
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 не имеет гнездования. Любая помощь будет оценена, я был Googling в течение часа без везения!
EDIT: В буквальном смысле кажется, что WHEN являются вложенными операциями CASE. Если я прокомментирую любые два из них, он будет работать без ошибок.
Что такое 'Qry1043'? –
Я предполагаю, что вы скопировали и вставили часть 'select'? Возможно ли, что он взял какое-то странное форматирование или не отображаемый символ? – ngneema
lc - Я понятия не имею, что такое «Qry1043» и «Qry1016», они не отображаются нигде в коде. ngneema - в исходном коде была таблица temp и вставка, я удалил эту часть для запуска только SELECT с CASE. – JeffK627