2011-12-21 4 views
0
Select @vCtlPeriod = period from ctl 
IF @vCtlPeriod = @Period 
    Begin 
    SET @vHdr = 'StkHdr' 
    SET @vDtl = 'StkDtl' 
    End 
ELSE 
    Begin 
    SET @vHdr = 'HStkHdr' 
    SET @vDtl = 'HStkDtl' 
    End 

SELECT H.Loc, D.MatCod, D.MatQty, H.Slipno, H.SapWH, 
    P.InvPri, P.InvPri * D.MatQty as InvAmt, P.ProCat, P.MaiGrp, P.SubGrp1,P.SerCod , 
    SUBSTRING(Z.LotNum,1,4) As ProdMth, F.UpdGSPI, 
    Class = Case WHen F.UpdGSPI = '9' Then 'D' 
       When Cast(SUBSTRING(Z.LotNum,1,2) AS INT) * 12 + Cast(SUBSTRING(Z.LotNum,3,2) AS INT)>= @vPerClsA Then 'A' 
       When Cast(SUBSTRING(Z.LotNum,1,2) AS INT) * 12 + Cast(SUBSTRING(Z.LotNum,3,2) AS INT)>= @vPerClsB Then 'B' 
       When Cast(SUBSTRING(Z.LotNum,1,2) AS INT) * 12 + Cast(SUBSTRING(Z.LotNum,3,2) AS INT)>= @vPerClsC1 Then 'C1' 
       When Cast(SUBSTRING(Z.LotNum,1,2) AS INT) * 12 + Cast(SUBSTRING(Z.LotNum,3,2) AS INT)>= @vPerClsC2 Then 'C2' 
       ELSE 'C3' 
       END, 
    FGType = Case F.UpdGSPI WHen '1' Then 'Production' 
          When '2' Then 'Trading' 
          When '3' Then 'Non GSPI' 
          When '9' Then 'DisContinue' 
          Else 
           'Not Maintain' 
          End, 
    FGSTATUS = Case When NOT ISNULL(Z.HolCod,'')='' or NOT ISNULL(Z.ResCod,'')='' Then 'Hold/Reserved' 
       When NOT ISNULL(Pd.Slipno,'')='' OR NOT ISNULL(Tg.Slipno,'')='' Then 'Pick' 
       ELSE '' 
       End, 
    Tg.SONum , Tg.Seq1, Tg.SptNum, Tg.Qty, Od.LPNum , 
    Z.LotNum, Z.DocRefNo, IsNull(Z.HolCod,'') As HolCod, IsNull(Z.HolInf,'') As HolInf, IsNull(Z.ResCod,'') As ResCod, IsNull(Z.ResInf,'') As ResInf 
FROM @vHdr H Join @vDtl D ON D.Slipno = H.Slipno And H.Period = @Period 
Join Prd P ON D.MatCod = P.ProCod 
Join LOCW L ON L.Loc = H.Loc AND L.Pickable <> 'Z' AND L.Putable <> 'Z' AND L.WhCod =H.SapWh 
Join ZV00 Z ON Z.SlipNo = H.SlipNo 
LEFT JOIN PrdFG F on F.Procod = D.MatCod 
LEFT JOIN (SELECT Slipno, MatCod, Qty =Sum(QtyPck) from PickD group by Slipno, matcod) Pd on D.SlipNo = Pd.Slipno and D.MatCod = Pd.MatCod 
LEFT JOIN TagLotQty Tg ON TG.SlipNo = D.SlipNo and Tg.procod = D.MatCod 
LEFT JOIN OrdD Od ON Od.SONum = Tg.SONum and Od.Seq1 = Tg.Seq1 

Выше моего кода в моей хранимой процедуре, я намерен проверить текущий период из файла ctl, если период является текущим периодом, после чего я получу из текущей таблицы транзакций, иначе он будет извлекается из таблицы транзакций истории.SQL-хранимая процедура

Но я не смог выполнить последний оператор выбора. Можем ли мы предопределить имя таблицы в переменной?

ответ

0

Вы должны использовать Dynamic SQL так:

Select @vCtlPeriod = period from ctl 
IF @vCtlPeriod = @Period 
    Begin 
    SET @vHdr = 'StkHdr' 
    SET @vDtl = 'StkDtl' 
    End 
ELSE 
    Begin 
    SET @vHdr = 'HStkHdr' 
    SET @vDtl = 'HStkDtl' 
    End 

declare @cmd varchar(500) 
select @cmd = "SELECT A.*, B.* from " + @vHDr + " A Join " + @vHdtl + " B ON A.Slipno = B.Slipno " 

exec (@cmd) 
+0

Я пытаюсь использовать Dynamic SQL, но он возвращает следующую ошибку: Идентификатор, начинающийся с 'SELECT ..... слишком длинный. Максимальная длина - 128. –

+0

Больше нет ошибки после того, как я установил QUOTED_IDENTIFIER в положение OFF. Спасибо всем за большую помощь! :) –

+0

@ Andrea.Ko без проблем m8 :) –

2

Нет, мы не можем. Вы должны использовать Dynamic SQL или переместить ваш ВЫБРАТЬ в IF заявление

2

Разве не проще просто:

Select @vCtlPeriod = period from ctl 
IF @vCtlPeriod = @Period 
    Begin 
      SELECt A.*, B.* from StkHdr A Join StkDtl B ON A.Slipno = B.Slipno 
    End 
ELSE 
    Begin 
      SELECt A.*, B.* from HStkHdr A Join HStkDtl B ON A.Slipno = B.Slipno 
    End 
+0

hm ... на самом деле, мой SQL-оператор довольно длинный, и я dun намерен поддерживать тот же оператор sql. –

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