使用SqlCommand从多个表中删除



当我试图用INNER JOIN从两个表中删除整行时,我会得到底部显示的错误。我在网上搜索了一下,没有找到问题,所以我来这里寻求帮助。

这是代码:

var delete = new SqlCommand("DELETE Posts, Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = @PostId;");
delete.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(delete);

我收到一条错误消息:

System.Data.SqlClient.SqlException: 'Incorrect syntax near ','.'

您在SQL Statement中的问题,它是无效的。

您应该将语句分为两部分:

首先删除Comments,然后删除Posts

序列很重要

var deleteComments = new SqlCommand("DELETE Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = @PostId;");
deleteComments.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(deleteComments);

var deletePosts = new SqlCommand("DELETE Posts WHERE PostId= @PostId;");
deletePosts.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(deletePosts);

另一个选项,使用一条语句:

var delete = new SqlCommand("DELETE Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = @PostId; DELETE Posts WHERE PostId= @PostId;");
delete.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(delete);

更多解释:

使用SQL Studio(SSMS(使用以下准备好的SQL脚本:

CREATE TABLE Posts (PostId  INT, PostText varchar(20))
CREATE TABLE Comments (CommentId INT, PostId INT, CommentText varchar(20))
INSERT INTO Posts VALUES (1, 'text')
INSERT INTO Comments VALUES (1,1, 'comment here')

当我运行您的DELETE语句时

DELETE Posts, Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = 1

它给了我相同的错误

当我运行时

DELETE Comments FROM Posts INNER JOIN Comments ON Posts.PostId = Comments.PostId WHERE Posts.PostId = 1;
DELETE Posts WHERE PostId = 1;

它运行良好。

因此,在这种情况下,经验法则是使用SSMS(MS SQL Studio(首先测试SQL语句,然后在C#中实现它。

MSSQL Server中没有在一条语句中从多个表中删除数据的选项。因此,您的声明DELETE Posts, Comments FROM是不正确的。

您有两个选项可以将这个外键设置为CASCADE DELETE,或者重写您的语句以删除这两个表中的数据,如下所示:

var delete = new SqlCommand("DELETE FROM Comments WHERE PostId = @PostId; 
DELETE FROM Posts WHERE PostId = @PostId;");
delete.Parameters.AddWithValue("@PostId", postId);
_dataAccess.ExecuteQuery(delete);

您的MS SQL查询不正确。如果你想从多个表中删除,你有两个选择:

  1. 设置级联删除,其中一个表中的删除将自动导致从属表中的删除

  2. 编写单独的删除查询,例如:

  • 从PostId=@PostId处的注释中删除
  • 从PostId=@PostId的帖子中删除

但是,我建议您在尝试为查询开发代码之前,先通过SQL Management Studio测试查询。

最新更新