2010-09-14 6 views
2

Je réalise que ce que je demande est peut-être impossible. Je veux effectuer une mise à jour sur deux tables distinctes basées sur une LEFT JOIN et une clause WHERE. Ceci est ma tentative:Mise à jour de plusieurs tables dans une instruction de mise à jour unique avec jointure à gauche

UPDATE PERIODDATES as pd, periods2 as p2 
SET  pd.[PERIODCODE] = @PERIODCODE, 
    p2.[USERCODE] = @USERCODE 
      left join periods2 AS p2 
    ON pdates.schemeid = p2.schemeid AND 

WHERE [SCHEMEID] = @SCHEMEID 

Est-ce possible?

Répondre

4

Ceci n'est pas possible. Vous ne pouvez mettre à jour qu'une table dans une seule instruction. Vous devrez diviser cela en deux déclarations.

Edit:

Mise à jour de deux tables dans une instruction est en fait possible, mais il devra créer une vue en utilisant un UNION qui contient les tables que vous souhaitez mettre à jour. Vous pouvez ensuite mettre à jour la vue qui mettra ensuite à jour les tables sous-jacentes. Il me semble que c'est un peu un hack pour moi mais ça marchera.

+0

Je suis d'accord cela semble un peu comme un hack, pense que je vais séparer la déclaration en attendant d'autres réponses. Des raisons pour lesquelles cela n'est pas possible alors? Il semble que ça devrait être. –

2

Relancer une vieille question ici, mais ... vous pouvez simuler la mise à jour de plusieurs tables dans une seule requête via deux requêtes UPDATE enveloppées dans une transaction. De cette façon, vous ne devez pas être gênant en utilisant des vues vers le haut-datable et aucune modification ne sera faite à moins que les deux tables sont mis à jour avec succès:

BEGIN TRANSACTION 

UPDATE PERIODDATES AS pd 
SET pd.PeriodCode = @PeriodCode 
WHERE [SCHEMEID] = @SCHEMEID; 

UPDATE periods2 AS pd2 
SET pd2.[USERCODE] = @USERCODE 
WHERE [SCHEMEID] = @SCHEMEID; 

COMMIT; 

pour vos inserts, vous pouvez utiliser IDENTITÉ @@ ou SORTIE EN à saisir l'ID du nouvel enregistrement à utiliser dans la deuxième table, à savoir:

DECLARE @ID int; 

BEGIN TRANSACTION 

INSERT INTO PERIODDATES(PeriodCode) AS pd 
VALUES (@PeriodCode) 
WHERE [SCHEMEID] = @SCHEMEID; 

SELECT @ID = @@IDENTITY; 

INSERT INTO periods2([SCHEMEID], [USERCODE]) AS pd2 
VALUES (@ID, @USERCODE); 

COMMIT; 
Questions connexes