【问题标题】:Stored Procedure - delete from table with joins存储过程 - 从带有连接的表中删除
【发布时间】:2018-06-09 07:25:32
【问题描述】:

我正在尝试学习 SQL,但遇到了存储过程的问题。我有一个如图所示的表结构,其中Repair.RepairerId 和Repair.CarId 是相应表的外键。

我需要做的是创建一个存储过程,允许用户从表 Repair 中删除实体,用户可以在 Microsoft SQL Server 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

但是 Visual Studio 2017 中的 SQL 编辑器给了我错误:

SQL46010:.. 附近的语法不正确

此外,所有INNER JOIN 语句及其= 符号以及单词LIKE、AND 和最后的LIKE 均呈灰色显示。 (我不确定这是否可以)。

您可以在下一张图片中看到这一点:

【问题讨论】:

  • SQL46010: Incorrect syntax near .. 的其余部分是什么意思?
  • 顺便说一句,“灰显”的 SQL 关键字实际上只是 SSMS 语法高亮显示。
  • 删除艺术。只需DELETE Repair FROM ...
  • @digital.aaron 它什么也没说,只是我提到的确切内容。并感谢您对 SSMS 语法的回答!
  • 啊,好吧,现在说得通了。错误告诉您语法不正确是在DELETE Repair.* 中的句点。

标签: sql sql-server stored-procedures sql-server-2017


【解决方案1】:

我会把逻辑写成:

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.*。那是无效的。注意其他一些事情:

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

这些都是“可选的”。但是编写清晰的代码是一个学习的好习惯。

【讨论】:

  • 还应该提到的是,使用LIKE @Vovch 编写它的方式很可能不会按照他/她的意图工作,除非在将通配符添加到参数之前将它们传递给存储过程。使用Model LIKE '%' + @Model + '%' 可能更有用
  • @digital.aaron 是的,你完全正确!谢谢!
【解决方案2】:

你好吗?

我认为问题在于您没有正确使用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 辆相同型号的汽车和多个相同名称的维修商!

祝你好运:)

【讨论】:

  • 谢谢,你完全正确。很遗憾我只能给出一个“正确答案”徽章。 :)
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多