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

이동 :

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

나는 동적를 사용하려고 SQL,하지만 다음 오류를 반환합니다. 'SELECT .....'로 시작하는 식별자가 너무 깁니다. 최대 길이는 128입니다. –

+0

SET QUOTED_IDENTIFIER을 OFF로 설정하면 더 이상 오류가 없습니다. 큰 도움에 감사드립니다! :) –

+0

@ Andrea.Ko 문제 없음 m8 :) –

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

흠 ... 사실, 내 SQL 문은 꽤 길고, 나는 같은 SQL 문을 유지하려고합니다. –