存储过程 - 通过连接从 table 中删除

Stored Procedure - delete from table with joins

我正在努力学习 SQL,但我 运行 遇到了存储过程的问题。我有一个如图所示的 tables 结构,其中 Repair.RepairerIdRepair.CarId 是相应 tables 的外键。

我需要做的是创建一个存储过程,允许用户从 table 维修中删除实体,用户可以在 select Microsoft [=40] 中的汽车型号和维修商名称=] 服务器 2017.

现在我有下一个代码:

CREATE PROCEDURE [dbo].[DeleteRepairInfo]
    @Name nvarchar(MAX),
    @Model nvarchar(MAX)
AS
    DELETE Repair.*
    FROM Repair INNER JOIN Repairer ON Repair.RepairerId = Repairer.Id
                INNER JOIN Car ON Repair.CarId = Car.Id
    WHERE Car.Model LIKE @Model AND Repairer.Name LIKE @Name
GO

但是 SQL Editor in Visual Studio 2017 给我错误:

SQL46010: Incorrect syntax near ..

所有 INNER JOIN 语句及其 = 符号以及单词 LIKEAND 和最后的 LIKE 都变灰了。 (我不确定这是否可以)。

你可以在下一张图片上看到这个:

我会把逻辑写成:

CREATE PROCEDURE [dbo].[DeleteRepairInfo] (
    @Name nvarchar(MAX),
    @Model nvarchar(MAX)
) AS
BEGIN
    DELETE r
    FROM Repair r INNER JOIN
         Repairer rr
         ON r.RepairerId = rr.Id INNER JOIN
         Car c
         ON r.CarId = c.Id
    WHERE c.Model LIKE @Model AND rr.Name LIKE @Name;
END;  -- DeleteRepairInfo

您的查询的问题在于语法 Repair.*。那是无效的。注意一些其他事项:

  • 这引入了 table 别名,因此查询更易于编写和阅读。
  • 存储过程的主体被BEGIN/END包围,所以很容易看到。
  • END 被注释为存储过程的名称。
  • 参数用括号括起来。

这些都是"optional"。但是编写清晰的代码是一个学习的好习惯。

你好吗?

我认为问题在于您没有正确使用 DELETE

下面的例子会对你有所帮助!

CREATE PROCEDURE [dbo].[DeleteRepairInfo]
    @Name nvarchar(MAX),
    @Model nvarchar(MAX)
AS
    DELETE FROM Repair as R
    WHERE R.CarId in (select CarId from Car where Model = @Model) 
    and R.RepairerId in (select RepairerId from Repairer where Name = @Name)        
GO

假设您可以拥有超过1辆相同型号的汽车和超过1名相同名称的维修人员!

祝你好运:)