存储过程 - 通过连接从 table 中删除
Stored Procedure - delete from table with joins
我正在努力学习 SQL,但我 运行 遇到了存储过程的问题。我有一个如图所示的 tables 结构,其中 Repair.RepairerId
和 Repair.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
语句及其 =
符号以及单词 LIKE
、AND
和最后的 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名相同名称的维修人员!
祝你好运:)
我正在努力学习 SQL,但我 运行 遇到了存储过程的问题。我有一个如图所示的 tables 结构,其中 Repair.RepairerId
和 Repair.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
语句及其 =
符号以及单词 LIKE
、AND
和最后的 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名相同名称的维修人员!
祝你好运:)