在引用表值参数时必须声明标量变量

时间:2017-08-21 20:44:39

标签: sql-server table-variable

这个问题来自this one

以下SQL有效:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Update_Repair_Details]
    @RepairID BIGINT,
    @NewDetails NewDetails READONLY
AS
BEGIN
    SET NOCOUNT ON;

    DELETE FROM Repair_Details
    WHERE RepairID = @RepairID

    INSERT INTO Repair_Details
        SELECT *, GETDATE()
        FROM @NewDetails
END

但由于RepairID是用户定义的表类型中的第一列,因此没有理由将其作为附加参数传递。

因此我写道:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Update_Repair_Details]
    @NewDetails NewDetails READONLY
AS
BEGIN
    SET NOCOUNT ON;

    DELETE FROM Repair_Details
    WHERE RepairID = @NewDetails.RepairID

    INSERT INTO Repair_Details
        SELECT *, GETDATE()
        FROM @NewDetails
END    

导致错误:

  

必须声明标量变量“@NewDetails”

为什么这个错误而前一个版本没有?

1 个答案:

答案 0 :(得分:2)

在这种情况下,@NewDetails是一个表格;因此,你不能只做WHERE RepairID = @NewDetails.RepairID。您可以使用INEXISTSJOIN

ALTER PROCEDURE [dbo].[Update_Repair_Details]
@NewDetails NewDetails READONLY
AS
BEGIN
    SET NOCOUNT ON;
    DELETE A
    FROM Repair_Details A
    INNER JOIN @NewDetails B
        ON A.RepairID = B.RepairID;

INSERT INTO Repair_Details
SELECT *, GETDATE()
FROM @NewDetails;
END