Im Zusammenhang mit der Entwicklung einer Cache-Logik bin ich auf ein kleines Problem gestoßen, auf dass ich hier kurz hinweisen möchte. Nehmen wir an, wir haben folgendes SQL-Skript:
- Leeren eines Tabelle
- Befüllen der Tabelle mit frischen Daten
Packt man die beiden Befehle (DELETE und INSERT) nicht in eine Transaktion, kann es passieren, dass man bei einem INSERT-Fehler auf einmal mit einer leeren Tabelle da steht (was ja nicht immer so gewollt ist).
Also habe ich folgende erweiterte Logik umgesetzt:
- Erstelle eine Transaktion
- Leeren eines Tabelle
- Befüllen der Tabelle mit frischen Daten
- wenn beides ohne Probleme lief, dann festschreiben (COMMIT)
- wenn es ein Problem gab, Rückgängig machen (ROLLBACK)
In meinen Tests mit einer Tabellen-Variable (@table) wollte das aber partout nicht funktionieren und ich bin wahnsinnig geworden (fast jedenfalls). Eine Änderung der Tabelle von Variable auf Temp (also statt @table auf #table) und schon klappt alles.
In einem Blog-Post wurde mein Verdacht dann auch bestätigt: es geht einfach nicht. Rollback wird bei Tabellen-Variablen nicht unterstützt…