簡體   English   中英

使用臨時表創建函數時出錯

[英]Error creating function with temporary tables

我正在創建一個包含臨時表的函數,對我來說使用帶有臨時表的函數有點困難,我完全不知道它是否允許在函數中使用,因為我是新的。

我正在嘗試創建的功能如下:

CREATE FUNCTION FunctionTest (
    @Anio   int=null,
    @Mes    int=Null,
    @Meses  int=6

)
RETURNS @Tabla TABLE (
    AnioMes INT,
    Viaje VARCHAR(30),
    IdPorte INT,
    Carga VARCHAR(20),
    Peso numeric(32, 16)
)
AS
BEGIN

    Declare @AnioMes    varchar(8),
            @AnioMes6   varchar(8)

    if @Anio is null
        Select  @Anio   = YEAR(GETDATE()),
                @Mes    = MONTH(GETDATE())

    Select  @AnioMes    = (case when @Mes=12 then @Anio+1 else @Anio end *100 + Case when @Mes=12 then 1 else @Mes+1 end)*100 + 1
    Select  @AnioMes6   = convert(varchar(8), DATEADD(mm, -@Meses, @AnioMes), 112 )

    INSERT INTO @Tabla (AnioMes,Viaje,IdPorte,Carga,Peso)   
    SELECT  year(cpsj.Delivery)*100 + MONTH(cpsj.Delivery) as AnioMes,  
            tr.TId as Viaje,
            cpsj.PId as IdPorte,            
            CASE WHEN tr.Load = 1 THEN 'CARGADO'
                WHEN tr.Load = 2 THEN 'VACIO'
            END  as Carga, 
            cpsj.Weight as Peso,            
    into #Temp
    FROM BDNEW.dbo.CENPACKSTOREJOIN cpsj 
    inner join TRANS tr on cpsj.ipId = tr.ipId
    inner join OPERA oper on tr.OId = oper.OId  
    WHERE   cpsj.Id = 'ID001'
    AND     tr.Area = 'lost'
    AND     tr.Status       = 2
    GROUP BY cpsj.Delivery, cpsj.IName
    ORDER BY cpsj.ipId

    if @AnioMes6 < '20160101'
        insert #Temp
        SELECT  Year(cpsj.Delivery)*100 + MONTH(cpsj.Delivery) as AnioMes,  
                tr.TId as Viaje,
                cpsj.PId as IdPorte,        
                CASE WHEN tr.Load = 1 THEN 'CARGADO'
                    WHEN tr.Load = 2 THEN 'VACIO'
                END  as Carga, 
                cpsj.Weight as Peso,                
        FROM BDOLD.dbo.CENPACKSTOREJOIN cpsj 
        inner join TRANS tr on cpsj.ipId = tr.ipId
        inner join OPERA oper on tr.OId = oper.OId
        WHERE   cpsj.Id = 'ID001'
        AND     tr.Area = 'lost'    
        AND     tr.Status       = 2
        GROUP BY cpsj.Delivery, cpsj.IName 
        ORDER BY cpsj.ipId

    Delete  #Temp
    where   viaje in (
                    select MAX(Viaje)
                    from    #Temp
                    group by IdPorte
                    having COUNT(IdPorte) > 1
                    )

    
    Select  AnioMes,
            Viaje,
            IdPorte, 
            Carga, 
            Peso, 
    from #Temp
    GROUP BY AnioMes,IdPorte Viaje, Carga, Peso
    ORDER BY AnioMes,IdPorte

RETURN 

END

如果您注意到我正在使用一個名為#Temp的臨時表。

作為嘗試編譯函數時的錯誤消息,我收到以下錯誤消息:

無法從函數內部訪問臨時表。

這就是為什么我之前提到如果您真的可以在函數中使用臨時表。

我感謝任何可以指導我如何處理此功能的人。

你要么使用

INSERT INTO @Tabla (AnioMes,Viaje,IdPorte,Carga,Peso)   
SELECT  year(cpsj.Delivery)*100 ...

或者

SELECT  year(cpsj.Delivery)*100 ...
INTO #Temp
FROM...

兩者都不是:

INSERT INTO @Tabla (AnioMes,Viaje,IdPorte,Carga,Peso)  
SELECT  year(cpsj.Delivery)*100 ...
INTO #Temp
FROM...

而且你不能在函數中使用臨時表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM