Sql 从存储过程插入临时表导致错误

Sql 从存储过程插入临时表导致错误,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个存储过程: 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,

我有一个存储过程:

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
在运行脚本时,我遇到以下错误:

提供的值的列名或数目与表定义不匹配


我已经检查了SELECT的别名,所有列都有名称。

您试图插入行的临时表包含的列比存储过程的结果多。在插入查询中提供列名,如下所示:

Insert into table(Column1, Column2....)
尝试以下操作:您的存储过程返回14列,临时表的列数超过14列,因此您必须在INSERT INTO TEMP中提及以下列,如果您未指定表的列名,则从存储过程返回的列数也必须相同

INSERT INTO #temp(SiteName
    , Country
    , BudgetPrj
    , PeriodEnd
    , DaysMtd
    , ToGoMtd
    , PeriodToTDays
    , MtdRev
    , PrjRevenue
    , BdgRev
    , TrgRev
    , BCMMtd
    , HrsMtd
    , FuelVal
    , FuelLtrs)
Exec sp_Prd_Dashboard_Summary @Period

最后,我创建了两个临时表,并将每个存储过程插入到每个表中,然后连接它们

这对我来说非常有效:

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

您最后选择的列是FuelPerc,在您的表中,FuelPerc后面有4列。如果只计算目标表中的选定列数和列数,您会发现它们不匹配。create table definition中的最后4列在select query from proc executionSide中没有列注意:您不应该对存储过程使用sp_uu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!很抱歉,我应该包括我正在尝试向temp表添加2个存储过程。
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