Przenoszę rekordy z jednej bazy danych do drugiej w ramach procesu archiwizacji. Chcę skopiować wiersze do tabeli docelowej, a następnie usunąć te same wiersze z tabeli źródłowej.
Moje pytanie brzmi: jaki jest najbardziej efektywny sposób sprawdzenia, czy pierwsza wstawka zakończyła się pomyślnie przed usunięciem wierszy.
Mój pomysł jest taki, ale wydaje mi się, że istnieje lepszy sposób:
@num_records=select count(ID) from Source_Table where (criteria for eligible rows)
insert * into Destination_Table where (criteria for eligible rows)
if ((select count(ID) from Destination_Table where (criteria) )=@numrecords)
delete * from Source_Table where (criteria)
Czy lepiej / jest możliwe połączenie go z funkcją RAISERROR? Dziękuję Ci!
źródło
OUTPUT
klauzuli? Nie dlatego, że to wszystko jedno zdanie. Pozwala także uniknąć konieczności dwukrotnego czytania wierszy (i możliwej utraty wierszy dodanych między odczytem dla wstawki a odczytem dla usunięcia)Sposób, w jaki myślałem o archiwizowaniu (co, jak jestem pewien, też nie jest idealny), polega na dodaniu nieco kolumny do nowej tabeli archiwum, takiej jak „Zarchiwizowane”, która miałaby wartość 1 po pomyślnym przesłaniu rekordu. Po przesłaniu wszystkich rekordów można wykonać operację usuwania, jednocześnie szukając wartości pola „Zarchiwizowane” wynoszącego „1”, tj. True z zarchiwizowanej tabeli.
Zgadzam się z Mike'em w kwestii używania Try / Catch.
źródło
Spróbuj tego:
źródło