问题
This question follows from this one.
The following SQL works:
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
But since RepairID
is the first column in the user-defined table type, there is no reason to pass it as an additional parameter.
Thus I wrote:
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
which causes an error:
Must declare the scalar variable "@NewDetails"
Why does this have the error while the previous version does not?
回答1:
In this case, @NewDetails
is a table; as such, you can't just do WHERE RepairID = @NewDetails.RepairID
. You can use IN
, EXISTS
or a JOIN
:
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
来源:https://stackoverflow.com/questions/45805242/must-declare-the-scalar-variable-when-referencing-a-table-valued-parameter