2010-04-23 7 views
2

Je souhaite supprimer des enregistrements des tables enfant ainsi que des tables parent dans une seule requête. s'il vous plaît trouver la requête donnée ci-dessous. ici l'en-tête de réponse est la table primaire et responseid est la clé primaire.Suppression d'enregistrements de plusieurs tables à la fois avec une seule requête dans sqlserver2005

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') 

mais son erreur de lancement. peut-on m'aider à trouver la bonne requête

+0

Toujours afficher autant d'informations que vous avez. Par exemple, "erreur de lancement"? S'il vous plaît poster le message d'erreur que vous obtenez. Si le message d'erreur "Table responseheader n'existe pas", il n'y a pas grand chose à faire pour vous aider, nous avons donc besoin de voir ce dont se plaint le moteur de base de données. –

Répondre

3

Sauf si vous utilisez une sorte de suppression en cascade, une seule instruction de suppression supprimera les lignes d'une seule table. Dans votre exemple, si la syntaxe est correcte, vous supprimerez uniquement les lignes de responseheader, le reste des tables est uniquement utilisé pour déterminer les lignes à supprimer de responseheader. Pour être franc, vous vraiment ne voulez pas utiliser une suppression en cascade, vous devez donc exécuter plusieurs instructions de suppression, une dans chaque table.

0

Vous pouvez créer une procédure stockée et appeler cette procédure stockée pour effectuer la suppression. Ou vous pouvez utiliser sp_executesql pour envoyer des requêtes par lots en une seule fois, comme suit:

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' 
0

Comme mentionné par Lasse cascade supprimer est la seule option pour supprimer de plusieurs tables avec une seule requête. Pour cela, vous devez configurer la clé étrangère et supprimer l'entrée dans la table principale. Là par les lignes dans la table enfant sera supprimé. Mais il vaut mieux ne pas l'utiliser. Il vaudra mieux utiliser plusieurs instructions de suppression. Vous pouvez également utiliser la transaction en définissant la validation automatique sur false. Puis supprimez les lignes et validez manuellement ou annulez comme requis.