SQL:具有多个临时表(变量)的多语句函数

时间:2016-02-22 00:43:51

标签: sql-server function stored-procedures

我创建了一个完美的存储过程。为了将其转换为函数以输出用于其他代码的表,我创建了一个多语句函数。

我不能使用临时表,所以我现在将它们声明为表变量,但我得到了错误。我尝试了所有我能想象和搜索的东西,但要么我做得不对,要么不支持。

将3个表声明为变量(而不是过程中的临时表)

我一直收到此错误:

  

Msg 137,Level 16,State 1,Procedure _SLA_report_funct,Line ...   必须声明标量变量" @SupCarsSche"。

下面的代码:

        USE DatabaseName
        GO
        SET ANSI_NULLS ON
        GO
        SET QUOTED_IDENTIFIER ON
        GO
        -- =============================================
        -- Author:      xxxxxxxxxxx
        -- Create date: 
        -- Description: 
        -- =============================================
        ALTER FUNCTION dbo._SLA_report_funct
        (
            -- Add the parameters for the function here
            @Interval varchar(20),
            @Starting_Datetime_offset int = 0,
            @Trip_or_Day varchar(4)
        )
        RETURNS 
        @Table_Var TABLE 
        (
            -- Add the column definitions for the TABLE variable here
            TrainNumber int,
            SerDate datetime,
            First varchar(50),
            Last varchar(50),
            CusCarNumber int,
            Fleet varchar(5),
            Scheduled_Car bigint,
            Depart varchar(50),
            DepartTime varchar(50),
            Arrive varchar(50), 
            ArriveTime varchar(50),
            NodeOD int,
            Caption nvarchar(255),
            Trip_Availability real,
            Trp_Availability_Count real,
            Duration int

        )
        AS
        BEGIN
            -- Fill the table variable with the rows for your result set

        DECLARE @SupCarsSche table
            (
                TrainNumber int,
                SerDate datetime,
                First varchar(50),
                Last varchar(50),
                CusCarNumber int,
                Fleet varchar(5),
                Scheduled_Car bigint,
                Depart varchar(50),
                DepartTime varchar(50),
                Arrive varchar(50), 
                ArriveTime varchar(50)
            )

        DECLARE @SQLTemp varchar(MAX)

        INSERT @SupCarsSche
            SELECT 
                vsch.TrainNumber,
                vsch.SerDate,
                vsch.First,
                vsch.Last,
                vsch. CusCarNumber,
                vsch.Fleet,
                vsch.CarNumber AS Scheduled_Car,
                vsch.Depart,
                vsch.DepartTime,
                vsch.Arrive,
                vsch.ArriveTime

                    FROM _viaschedule5 AS vsch
                    RIGHT JOIN _supported_cars as supc ON vsch.CarNumber=supc.CarNumber
                    WHERE 
                    ((@Interval='MONTH') AND (datediff(MONTH, CAST(vsch.SerDate as DATE),(CAST(GETDATE() as DATE)))=@Starting_Datetime_offset) AND 
                    (vsch.CarNumber LIKE '73%' OR NOT (vsch.CusCarNumber=''))) 
                    OR 
                    ((@Interval='DAY') AND (datediff(DAY, CAST(vsch.SerDate as DATE),(CAST(GETDATE() as DATE)))=@Starting_Datetime_offset) AND 
                    (vsch.CarNumber LIKE '73%' OR NOT (vsch.CusCarNumber='')))

        DECLARE @TripAvail table
            (
                NodeID int,
                Caption nvarchar(255),
                Trip_Availability real,
                Trp_Availability_Count real,
                SerDate datetime,
                TrainNumber int,
                Scheduled_Car bigint,
                DepartTime varchar(50),
                ArriveTime varchar(50),
                Duration int
            )

        INSERT @TripAvail
            SELECT 
                Nodes.NodeID,
                Nodes.Caption AS Caption,
                AVG(ResponseTime_Detail.Availability) AS Trip_Availability,
                COUNT(ResponseTime_Detail.Availability) AS Trp_Availability_Count,
                @SupCarsSche.SerDate,
                @SupCarsSche.TrainNumber,
                @SupCarsSche.Scheduled_Car,
                @SupCarsSche.DepartTime,
                @SupCarsSche.ArriveTime,
            CASE 
            WHEN 
                (Datediff(MINUTE,CAST(@SupCarsSche.DepartTime as TIME),CAST(@SupCarsSche.ArriveTime as TIME))>0)
            THEN
                Datediff(MINUTE,CAST(@SupCarsSche.DepartTime as TIME),CAST(@SupCarsSche.ArriveTime as TIME))
            ELSE 
                CAST ((24*60)-(DATEPART(hour, @SupCarsSche.DepartTime) * 60) - (DATEPART(minute, @SupCarsSche.DepartTime) * 1)+
                (DATEPART(hour, @SupCarsSche.ArriveTime) * 60) + (DATEPART(minute, @SupCarsSche.ArriveTime) * 1)AS INT)
            END AS Duration 
            FROM @SupCarsSche
            LEFT JOIN Nodes ON (@SupCarsSche.Scheduled_Car = Nodes.Coach_ID)
            LEFT JOIN ResponseTime_Detail ON ((Nodes.NodeID=ResponseTime_Detail.NodeID) AND (
            ((ResponseTime_Detail.DateTime BETWEEN (@SupCarsSche.SerDate+@SupCarsSche.DepartTime) AND (@SupCarsSche.SerDate+@SupCarsSche.ArriveTime))AND @SupCarsSche.DepartTime<@SupCarsSche.ArriveTime) OR 
            ((ResponseTime_Detail.DateTime BETWEEN (@SupCarsSche.SerDate+@SupCarsSche.DepartTime) AND (DATEADD(DAY,1,@SupCarsSche.SerDate+@SupCarsSche.ArriveTime)))AND @SupCarsSche.DepartTime>@SupCarsSche.ArriveTime )))
            GROUP BY @SupCarsSche.TrainNumber,Nodes.NodeID,@SupCarsSche.SerDate,@SupCarsSche.Scheduled_Car,Nodes.Caption, 
            @SupCarsSche.DepartTime, @SupCarsSche.ArriveTime,
            CASE WHEN (
                Datediff(MINUTE,CAST(@SupCarsSche.DepartTime as TIME),CAST(@SupCarsSche.ArriveTime as TIME))>0)
            THEN
                Datediff(MINUTE,CAST(@SupCarsSche.DepartTime as TIME),CAST(@SupCarsSche.ArriveTime as TIME))
            ELSE 
                CAST ((24* 60)-(DATEPART(hour, @SupCarsSche.DepartTime) * 60) - (DATEPART(minute, @SupCarsSche.DepartTime) * 1)+(DATEPART(hour, @SupCarsSche.ArriveTime) * 60) + (DATEPART(minute, @SupCarsSche.ArriveTime) * 1)AS INT)
            END

        RETURN
        END

1 个答案:

答案 0 :(得分:0)

看起来当我使用表变量时,我需要添加

    FROM @SupCarsSche AS SCSH

之后,我在各处使用SCSH而不是变量名。

这似乎解决了这个问题。