Хранимая процедура SQL - PullRequest
       7

Хранимая процедура SQL

0 голосов
/ 21 декабря 2011
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. Если период является текущим периодом, я получу из таблицы текущих транзакций, иначе он будет получен изтаблица истории транзакций.

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

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Не проще ли просто:

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 
2 голосов
/ 21 декабря 2011

Нет, мы не можем.Вы должны использовать Динамический SQL или переместить SELECT в оператор IF

0 голосов
/ 21 декабря 2011

Вы должны использовать Динамический 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...