这个问题来自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”
为什么这个错误而前一个版本没有?
答案 0 :(得分:2)
在这种情况下,@NewDetails
是一个表格;因此,你不能只做WHERE RepairID = @NewDetails.RepairID
。您可以使用IN
,EXISTS
或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