2017-11-20 5 views
1

의 원인 I이 저장 프로 시저가 있습니다삽입 오류

ALTER Procedure [dbo].[sp_Prd_Dashboard_Summary] 
    (@Period AS INT) 
AS 
    SELECT 
     SiteName AS SiteName, 
     MAX(Country) AS Country, 
     BudgetPrj, 
     MAX(PeriodEnd) AS PeriodEnd, 
     MAX(DaysMtd) AS DaysMtd, 
     MAX(ToGoMtd) AS ToGoMtd, 
     MAX(PeriodToTDays) AS PeriodToTDays, 
     SUM(MTDRevenue) AS MtdRev, 
     SUM(MTDRevenue)/NULLIF(MAX(DaysMTD), 0) * MAX(PeriodToTDays) AS PrjRevenue, 
     SUM(BdgRevenue) AS BdgRev, SUM(TrgRevenue) AS TrgRev, 
     SUM(BCMMtd) AS BCMMtd, SUM(HrsMtd) AS HrsMTD, 
     SUM(FuelVal) AS FuelVal, SUM(FuelLtrs) AS FuelLtrs, 
     SUM(FuelVal)/NULLIF(SUM(MTDRevenue), 0) AS FuelPerc 
    FROM 
     (SELECT 
      St.SiteName as SiteName, 
      St.Country as Country, 
      Null as BudgetPrj, Prd.PeriodEnd as PeriodEnd, 
      Day(GetDate()) as DaysMtd, 
      Prd.PeriodNoDays - Day(GetDate()) as ToGoMtd, 
      Prd.PeriodNoDays as PeriodToTDays, 
      0 as MTDRevenue, 0 as BdgRevenue, 
      0 as TrgRevenue, 0 as BCMMtd, 
      0 as HrsMtd, 0 as FuelVal, 
      0 as FuelLtrs 
     FROM 
      Periods Prd 
     JOIN 
      Sites St ON Prd.PeriodSiteID = St.SiteId 
     WHERE 
      Prd.Period = @Period AND St.SiteActive = 1 

     UNION All 

    Select SiteName as SiteName 
    , Dit.Country as Country 
    , Null as BudgetPrj 
    , Null as PeriodEnd 
    , 0 DaysMtd 
    , 0 as ToGoMtd 
    , 0 as PeriodToTDays 
    , IIF(Dit.Wcode = 101, 
      IIF(DiT.WBillMeth = 'Hours', DiT.Hrs * DiT.OpBill, 
       IIF(DiT.WBillMeth = 'BCM', Loads * DiT.ModelSize * DiT.WBillRate, 
        IIF(DiT.WBillMeth = 'Cost Plus', (DiT.Hrs * (DiT.OwnBill + DiT.OpBill)) + 
         (DiT.ShiftHrs * DiT.EmpBill),0))),0) as MTDRevenue 
    , 0 as BdgRevenue 
    , 0 as TrgRevenue 
    , IIF(DiT.WBillMeth = 'BCM', Loads * DiT.ModelSize, 0) as BCMMtd 
    , IIF(Dit.Wcode = 101, 
      IIF(DiT.WBillMeth <> 'BCM', DiT.Hrs, 0),0) as HrsMtd 
    , DiT.Fuel * DiT.FuelRate as FuelVal 
    , DiT.Fuel as FuelLtrs 

    From DataInputTotal DiT 

    Where DiT.Period = @Period and DiT.SiteActive = 1 

    Union All 

    Select SiteName as SiteName 
    , St.Country as Country 
    , Bdgt.BudgetProject as BudgetPrj 
    , Prd.PeriodEnd as PeriodEnd 
    , 0 as DaysMtd 
    , 0 as ToGoMtd 
    , 0 as PeriodToTDays 
    , 0 as MTDRevenue 
    , PrjRev as BdgRevenue 
    , BudgTarget as TrgRevenue 
    , 0 as BCMMtd 
    , 0 as HrsMtd 
    , 0 as FuelVal 
    , 0 as FuelLtrs 

    From Budget Bdgt Join 
     Sites St on Bdgt.SiteId = St.SiteId Join 
     Periods Prd on Bdgt.Period = prd.Period and Bdgt.SiteId = Prd.PeriodSiteID 

    Where Bdgt.Period = @Period and St.SiteActive = 1 

) a 


Group By SiteName, BudgetPrj 

나는 프로 시저를 호출하고 아래 스크립트를 임시 테이블에 결과를 삽입하려고 :

Declare @Period int = 22 
Declare @DaysinMonth Int = 29 
Declare @DayHrs Int = 24 

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp 

Create Table #Temp (SiteName nvarchar(50) 
        , Country nvarchar(50) 
        , BudgetPrj nvarchar(50) 
        , PeriodEnd DateTime 
        , DaysMtd Int 
        , ToGoMtd Int 
        , PeriodToTDays Int 
        , MtdRev Numeric(13,2) 
        , PrjRevenue Numeric(13,2) 
        , BdgRev Numeric(13,2) 
        , TrgRev Numeric(13,2) 
        , BCMMtd Numeric(13,2) 
        , HrsMtd Numeric(13,2) 
        , FuelVal Numeric(13,2) 
        , FuelLtrs Numeric(13,2) 
        , FuelPerc Numeric(13,2) 
        , FltCnt Int 
        , Availibility Numeric(13,2) 
        , Utilization Numeric(13,2) 
        , Idle Numeric(13,2) 
        ) 

Insert #temp 
Exec sp_Prd_Dashboard_Summary @Period 
Insert into #temp 
Exec summary_fleet_performance @DayHrs, @Period, @DaysinMonth 

나는 다음과 같은 오류 얻을 스크립트를 실행하는 경우 : 나는의 별칭을 확인했다

Column name or number of supplied values does not match table definition.

SELECT이고 모든 열에 이름이 있습니다.

+1

당신의 마지막 선택 열 FuelPerc'는 테이블에'FuelPerc'를 다음과 같은 4 열이있다 '입니다. 목표 테이블에서 선택된 컬럼과 컬럼의 수를 단순히 계산하면, 일치하지 않는 것을 볼 수 있습니다. – HoneyBadger

+0

create table 정의의 마지막 4 개 열에 proc 실행 –

+1

에서 선택한 쿼리에 열이 없습니다. 참고 : 저장 프로 시저에 대해 'sp_' 접두어를 사용하지 말아야합니다 **. Microsoft는 [자체 저장을 위해이 접두어를 예약했습니다 (* 저장 프로 시저 명명 * 참조)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) 및 당신은 미래에 언젠가 이름 충돌의 위험을 감수해야합니다. [저장 프로 시저 성능에 좋지 않습니다.] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). 'sp_'를 피하고 다른 것을 접두어로 사용하는 것이 가장 좋습니다. –

답변

1

임시 테이블을 두 개 만들고 각 저장 프로 시저를 각 테이블에 삽입 한 다음 결합했습니다.

그것은 나를 위해 완벽하게 작동 :

ALTER Procedure [dbo].[summary_dashboard] 
(
@Period int, 
@DaysinMonth Int, 
@DayHrs Int 
) 
as 
Declare @Tbl1 as table (SiteName nvarchar(50) null 
        , Country nvarchar(50) null 
        , BudgetPrj nvarchar(50) null 
        , PeriodEnd DateTime null 
        , DaysMtd Int null 
        , ToGoMtd Int null 
        , PeriodToTDays Int null 
        , MtdRev Numeric(13,2) null 
        , PrjRevenue Numeric(13,2) null 
        , BdgRev Numeric(13,2) null 
        , TrgRev Numeric(13,2) null 
        , BCMMtd Numeric(13,2) null 
        , HrsMtd Numeric(13,2) null 
        , FuelVal Numeric(13,2) null 
        , FuelLtrs Numeric(13,2) null 
        , FuelPerc Numeric(13,2) null 
        ) 
Declare @Tbl2 as Table (SiteName nvarchar(50) null 
         , FltCnt Int null 
         , Availability Numeric (5,2) null 
         , Utilization Numeric (5,2) Null 
         , Idle Numeric(5,2) 
         ) 


insert into @Tbl1 (SiteName 
        , Country 
        , BudgetPrj 
        , PeriodEnd 
        , DaysMtd 
        , ToGoMtd 
        , PeriodToTDays 
        , MtdRev 
        , PrjRevenue 
        , BdgRev 
        , TrgRev 
        , BCMMtd 
        , HrsMtd 
        , FuelVal 
        , FuelLtrs 
        , FuelPerc 
        ) 
Exec sp_Prd_Dashboard_Summary @Period 

insert into @tbl2 (SiteName 
         , FltCnt 
       , Availability 
        , Utilization 
        , Idle 
       ) 
    Exec summary_fleet_performance @DayHrs, @Period, @DaysinMonth 


    select tbl1.SiteName 
        , tbl1.Country 
        , tbl1.BudgetPrj 
        , tbl1.PeriodEnd 
        , tbl1.DaysMtd 
        , tbl1.ToGoMtd 
        , tbl1.PeriodToTDays 
        , tbl1.MtdRev 
        , tbl1.PrjRevenue 
        , tbl1.BdgRev 
        , tbl1.TrgRev 
        , tbl1.BCMMtd 
        , tbl1.HrsMtd 
        , tbl1.FuelVal 
        , tbl1.FuelLtrs 
        , tbl1.FuelPerc 
        , tbl2.FltCnt 
        , tbl2.Availability 
        , tbl2.Utilization 
        , tbl2.Idle 


from @tbl1 tbl1 full outer join 
    @tbl2 tbl2 
on tbl1.SiteName = tbl2.SiteName 
1

행을 삽입하려는 임시 테이블에 저장 프로 시저의 결과보다 많은 열이 포함되어 있습니다. 다음과 같이 삽입 쿼리에서 열 이름을 제공합니다 :

Insert into table(Column1, Column2....) 
1

TRY 본 : 귀하의 저장 프로 시저 (14) 열을 반환하고 다음과 같이하고 경우 INSERT INTO #TEMP의 열을 언급 그래서 임시 테이블 그 이상이있다 테이블의 열 이름을 지정하지 않으면 STORED PROCEDURE에서 반환하는 열도 동일해야합니다.