2017-11-20 2 views
1

Ich habe diese gespeicherte Prozedur:Einfügen in temporäre Tabelle von gespeicherten Prozedur verursacht Fehler

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 

Ich versuche, den Vorgang zu rufen und das Ergebnis in eine temporäre Tabelle mit dem folgenden Skript einfügen:

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 

Beim Ausführen des Skripts ich die folgende Fehlermeldung erhalten:

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

ich die Aliase von der überprüft haben SELECT und alle Spalten haben Namen.

+1

Ihre letzte ausgewählte Spalte ist 'FuelPerc', da in der Tabelle sind folgende vier Spalten' FuelPerc'. Wenn Sie einfach die Anzahl der ausgewählten Spalten und Spalten in der Zieltabelle zählen, sehen Sie, dass sie nicht übereinstimmt. – HoneyBadger

+0

Die letzten 4 Spalten in der Create-Tabellendefinition haben keine Spalten in der Select-Abfrage von der Proc-Ausführung –

+1

Randnotiz: Sie sollten ** nicht ** das Präfix 'sp_' für Ihre gespeicherten Prozeduren verwenden. Microsoft hat [dieses Präfix für seine eigene Verwendung reserviert (siehe * Gespeicherte Prozeduren benennen *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), und Sie riskieren irgendwann in der Zukunft einen Namenskonflikt. [Es ist auch schlecht für die Leistung Ihrer gespeicherten Prozedur] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Es ist am besten, einfach 'sp_' zu vermeiden und etwas anderes als Präfix zu verwenden - oder gar kein Präfix! –

Antwort

1

I ended zwei temporäre Tabellen erstellen und jede gespeicherte Prozedur in jeder Tabelle einfügen und verbinden sie dann.

Es funktionierte perfekt für mich:

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

Die temporäre Tabelle, in die Sie Zeilen einfügen möchten, enthält mehr Spalten als das Ergebnis der gespeicherten Prozedur. Geben Sie Spaltennamen in INSERT-Abfrage, wie folgt aus:

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

TRY THIS: Ihre gespeicherte Prozedur ist 14 Spalten und temporäre Tabelle hat mehr als das zurückkehr, so dass Sie Spalten in der INSERT INTO #TEMP wie unten und wenn Sie zu erwähnen, Geben Sie nicht den Spaltennamen der Tabelle an, dann müssen auch die Spalten von STORED PROCEDURE identisch sein.

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