navigation sur divers exemples sur la façon de créer une déclaration de UPSERT « bonne » shown here, j'ai créé le code suivant (j'ai changé les noms de colonnes):SQL Server: transaction UPSERT ne pas atteindre insérer
BEGIN TRANSACTION
IF EXISTS (SELECT *
FROM Table1 WITH (UPDLOCK, SERIALIZABLE), Table2
WHERE Table1.Data3 = Table2.data3)
BEGIN
UPDATE Table1
SET Table1.someColumn = Table2.someColumn,
Table1.DateData2 = GETDATE()
FROM Table1
INNER JOIN Table2 ON Table1.Data3 = Table2.data3
END
ELSE
BEGIN
INSERT INTO Table1 (DataComment, Data1, Data2, Data3, Data4, DateData1, DateData2)
SELECT
'some comment', data1, data2, data3, data4, GETDATE(), GETDATE()
FROM
Table2
END
COMMIT TRANSACTION
Mon le problème est, qu'il ne fait jamais la partie INSERT
. Le INSERT
seul fonctionne bien. Le script en cours ne fait que la partie de mise à jour.
J'ai une idée que l'insertion est seulement bonne, si elle peut insérer l'ensemble des données qu'elle trouve (à cause de la requête de sélection)? Sinon, cela ne fonctionnera pas. Si oui, comment puis-je l'améliorer?
J'ai également lu à propos de la clause MERGE
et je voudrais l'éviter.
// EDIT:
Après avoir essayé quelques échantillons trouvés sur Internet et expliqué ici, je re-fait ma logique comme suit:
BEGIN TRANSACTION
BEGIN
UPDATE table1
SET something
WHERE condition is met
UPDATE table2
SET helpColumn = 'DONE'
WHERE condition is met
END
BEGIN
INSERT INTO table1(data)
SELECT data
FROM table2
WHERE helpColumn != 'DONE'
END
COMMIT TRANSACTION
Lorsque vous essayez d'autres solutions, la INSERT
habituellement échoué ou a fonctionné pendant longtemps (sur quelques tables, je peux l'accepter, mais pas bon, si vous projetez de migrer des données entières d'une base de données à une autre base de données).
Ce n'est probablement pas la meilleure solution, je pense. Mais pour l'instant ça marche, des commentaires?
Vous vérifiez actuellement si le EXISTS renvoie toutes les lignes, mais il n'y a pas de corrélation avec la mise à jour réelle. Pourquoi ne voulez-vous pas utiliser MERGE, c'est exactement pourquoi cela a été implémenté? – dnoeth
votre requête existante retournera toujours vrai quand il y a *** n'importe quelle ligne qui se connecte avec succès entre 'table1' et' table2' - vous devez faire cela en fonction des informations clés que vous vérifiez de nouveau (en tant que exemple) – Kritner
Pour autant que j'ai lu, MERGE a ses défauts et comme je le vois, j'ai beaucoup plus de contrôle sur les données, lorsque je fais des mises à jour, INSERTS personnalisés. – Asko