Sql server SQL函数创建错误-";必须声明标量变量";

Sql server SQL函数创建错误-";必须声明标量变量";,sql-server,user-defined-functions,database-table,Sql Server,User Defined Functions,Database Table,我正在尝试创建此函数,该函数返回一个表,并将表名作为参数: CREATE FUNCTION GetCostData(@CostTable VARCHAR(30)) RETURNS @H2 TABLE ( Repairdate datetime NOT NULL, ReceivedDate datetime NOT NULL ) AS BEGIN INSERT INTO @H2(DataFactura, Data) SELECT R

我正在尝试创建此函数,该函数返回一个表,并将表名作为参数:

CREATE FUNCTION GetCostData(@CostTable VARCHAR(30))
RETURNS @H2 TABLE (
    Repairdate    datetime     NOT NULL,
    ReceivedDate  datetime     NOT NULL
)  
AS
BEGIN 
    INSERT INTO @H2(DataFactura, Data)
      SELECT R1.Repairdate, Max(H1.ReceivedDate) as ReceivedDate
        FROM @CostTable R1
        JOIN History H1 
        ON R1.VehicleID=H1.VehicleID 
        AND H1.ReceivedDate < R1.RepairDate
        GROUP BY R1.RepairDate;
    RETURN;
END;
创建函数GetCostData(@CostTable VARCHAR(30))
返回@H2表(
Repairdate日期时间不为空,
ReceivedDate日期时间不为空
)  
作为
开始
插入@H2(数据事实,数据)
选择R1.Repairdate,Max(H1.ReceivedDate)作为ReceivedDate
来自@CostTable R1
加入历史H1
在R1上。车辆ID=H1。车辆ID
和H1.ReceivedDate

但我得到“必须声明标量变量“@CostTable.”错误。为什么?如何修复它?

由于不能在函数中使用动态SQL,最好将其转换为存储过程:

CREATE PROCEDURE GetCostData(@CostTable VARCHAR(30)) 
AS
BEGIN 
  DECLARE @sql NVARCHAR(1000) =
  N'SELECT R1.Repairdate, Max(H1.ReceivedDate) as ReceivedDate
    FROM ' + @CostTable + N'R1
    JOIN History H1 
    ON R1.VehicleID=H1.VehicleID 
    AND H1.ReceivedDate < R1.RepairDate
    GROUP BY R1.RepairDate'

    EXEC (@sql)
END

您缺少DECLARE@CostTable语句

请尝试以下代码:

CREATE FUNCTION GetCostData(@CostTable VARCHAR(30))
RETURNS @H2 TABLE (
    Repairdate    datetime     NOT NULL,
    ReceivedDate  datetime     NOT NULL
)

AS

BEGIN 
DECLARE @CostTable table (RepairDate datetime not null) 
    INSERT INTO @H2(DataFactura, Data)
      SELECT R1.Repairdate, Max(H1.ReceivedDate) as ReceivedDate
        FROM @CostTable R1
        JOIN History H1 
        ON R1.VehicleID=H1.VehicleID 
        AND H1.ReceivedDate < R1.RepairDate
        GROUP BY R1.RepairDate;
    RETURN;
END;
创建函数GetCostData(@CostTable VARCHAR(30))
返回@H2表(
Repairdate日期时间不为空,
ReceivedDate日期时间不为空
)
作为
开始
声明@CostTable(RepairDate-datetime不为空)
插入@H2(数据事实,数据)
选择R1.Repairdate,Max(H1.ReceivedDate)作为ReceivedDate
来自@CostTable R1
加入历史H1
在R1上。车辆ID=H1。车辆ID
和H1.ReceivedDate

希望这有帮助

CostTable
VARCHAR
,您可能需要使用动态sql。我认为,您不能在函数中使用动态sql。。。您需要将其更改为存储过程。注意您正在做的事情。像这样的泛型函数,尤其是在另一个SELECT中使用它们时,会消耗性能。有时,在SQL中,最好复制/粘贴代码谢谢,但我无法将其转换为SP,因为我正在查询中使用它。谢谢,但我无法将其转换为SP,因为我正在查询中使用它。您在查询中使用它的方式是什么?请参见此处:
CREATE FUNCTION GetCostData(@CostTable VARCHAR(30))
RETURNS @H2 TABLE (
    Repairdate    datetime     NOT NULL,
    ReceivedDate  datetime     NOT NULL
)

AS

BEGIN 
DECLARE @CostTable table (RepairDate datetime not null) 
    INSERT INTO @H2(DataFactura, Data)
      SELECT R1.Repairdate, Max(H1.ReceivedDate) as ReceivedDate
        FROM @CostTable R1
        JOIN History H1 
        ON R1.VehicleID=H1.VehicleID 
        AND H1.ReceivedDate < R1.RepairDate
        GROUP BY R1.RepairDate;
    RETURN;
END;