我创建了一个完美的存储过程。为了将其转换为函数以输出用于其他代码的表,我创建了一个多语句函数。
我不能使用临时表,所以我现在将它们声明为表变量,但我得到了错误。我尝试了所有我能想象和搜索的东西,但要么我做得不对,要么不支持。
将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
答案 0 :(得分:0)
看起来当我使用表变量时,我需要添加
FROM @SupCarsSche AS SCSH
之后,我在各处使用SCSH而不是变量名。
这似乎解决了这个问题。