在sqlserver2005中使用单个查询一次删除多个表中的记录

时间:2010-04-23 06:09:21

标签: sql-server-2005 delete-row

我想在一个查询中删除子表和父表中的记录。请找到下面给出的查询。这里的响应头是主表,而responseid是主键。

DELETE FROM responseheader
    FROM responseheader
    INNER JOIN responsepromotion ON responseheader.responseid = responsepromotion.ResponseID
    INNER JOIN responseext ON responsepromotion.ResponseID=responseext.ResponseID 
    WHERE responseheader.responseid In ('67D8B9E8-BAD2-42E6-BAEA-000025D56253')

但它的投掷错误。任何人都可以帮我找出正确的查询

3 个答案:

答案 0 :(得分:3)

除非您使用某种级联删除,否则单个删除语句将从单个表中删除行。

在您的示例中,如果语法正确,您将仅从responseheader删除行,其余表仅用于确定要从responseheader中删除哪些行。

说实话,你确实不想使用级联删除,所以你应该执行多个删除语句,每个表一个。

答案 1 :(得分:0)

您可以创建存储过程并调用该存储过程来执行删除操作。或者您可以使用sp_executesql一次发送批处理查询,如下所示:

sp_executesql 

    'DELETE FROM responsepromotion
        FROM responsepromotion
        INNER JOIN responseheader ON responseheader.responseid = responsepromotion.ResponseID
        WHERE responseheader.responseid = @guid;

    DELETE FROM responseext
        FROM responseext
        INNER JOIN responseheader ON responsepromotion.ResponseID=responseext.ResponseID
        WHERE responseheader.responseid = @guid;

    DELETE FROM responseheader
        WHERE responseid = @guid;',

    @guid = '67D8B9E8-BAD2-42E6-BAEA-000025D56253'

答案 2 :(得分:0)

正如Lasse cascade提到的那样,删除是使用单个查询从多个表中删除的唯一选项。为此,您应设置外键并删除主表中的条目。子表中的行将被删除。但最好不要使用它。最好使用多个delete语句。您还可以通过将auto commit设置为false来使用事务。然后删除行并根据需要手动提交或回滚。