2013-09-19 4 views
1

У меня есть запрос, который работает в инструкции 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. Если я прокомментирую любые два из них, он будет работать без ошибок.

+1

Что такое 'Qry1043'? –

+0

Я предполагаю, что вы скопировали и вставили часть 'select'? Возможно ли, что он взял какое-то странное форматирование или не отображаемый символ? – ngneema

+0

lc - Я понятия не имею, что такое «Qry1043» и «Qry1016», они не отображаются нигде в коде. ngneema - в исходном коде была таблица temp и вставка, я удалил эту часть для запуска только SELECT с CASE. – JeffK627

ответ

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 

также отметить, что если вы действительно хотите номер, который вы можете использовать встроенную функцию МЕСЯЦ

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, начинающихся (вложенных) и без конца для случая.

+0

Вопрос показывает, что вложенные 'CASE' и OP не указывают, что нет вложенных операторов' CASE'. –

+0

Уверяю вас, это мой фактический код. Я просто попытался использовать кавычки, как вы предлагали, но получил ту же ошибку. Однако объявление @MonthUnits как int и использование функции MONTH изменило ошибку на «Msg 156, Level 15, State 1, Line 25 Неправильный синтаксис рядом с ключевым словом« select ».» Другие ошибки исчезли. – JeffK627

+0

Фактически синтаксическая ошибка была вызвана отсутствующей закрывающей скобкой, исходные ошибки все еще происходят. – JeffK627

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-го уровня» ошибка

+0

мы не можем объявлять переменные внутри представления. Как это работает в представлении? Есть идеи? –

+0

есть ли у вас столбец, соответствующий значению @MonthUnits? , вы можете указать имя столбца вместо "@MonthUnits" – Viji

Смежные вопросы