Nie ma potrzeby robienia kopii zapasowych i przywracania, ani wywoływania / koordynowania procesów zewnętrznych (np. BCP), ani nawet bałagania w SSIS (bardzo potężny, bardzo fajny, ale jeśli mogę tego uniknąć, na pewno będę :). Możesz sobie z tym wszystkim poradzić, korzystając z T-SQL, w procedurze przechowywanej, którą możesz zaplanować za pomocą agenta SQL lub skryptu uruchamianego raz w miesiącu (chociaż posiadanie go w proc i planowanie jest mniej pracochłonne biegać). W jaki sposób? Korzystając z SQLCLR, aby uzyskać dostęp do SqlBulkCopy
klasy w .NET, ponieważ jest to zasadniczo BCP, bez kłopotów z wywoływaniem BCP. Możesz to sam kodować: nie ma super skomplikowanej konfiguracji ani niczego takiego jakSqlBulkCopy
klasa zajmuje się prawie wszystkim za Ciebie (możesz ustawić wielkość partii, niezależnie od tego, czy chcesz uruchamiać wyzwalacze itp.). Lub, jeśli nie chcesz zadzierać ze skompilowaniem i wdrożeniem zestawu , możesz użyć wstępnie zbudowanej procedury składowanej SQLCLR, takiej jak DB_BulkCopy, która jest częścią biblioteki SQL # SQLCLR (której jestem autorem, ale jest ona przechowywana procedura jest w wersji darmowej). Opisuję to bardziej szczegółowo, w tym przykład użycia DB_BulkCopy , w następującej odpowiedzi:
Importuj dane z jednej bazy danych do innego skryptu
Jeśli nie jest jasne, gdzie umieścić to w bieżącym planie, wykonaj następujące czynności:
- Usuń kroki 1 i 2 (woo hoo!)
- Wymienić krok 5 ze związkiem
EXEC
o DB_BulkCopy czy cokolwiek to nazwać, jeśli to sam kod, który po prostu przenosi dane z punktu A do punktu B.
Należy również zauważyć, że SqlBulkCopy
i DB_BulkCopy :
- może zaakceptować dowolny zestaw wyników: nie ma znaczenia, czy jest to WYBÓR, czy EXEC procedury składowanej
- są bardzo łatwe do aktualizacji, gdy zmiany schematu zostaną wprowadzone w dowolnej z tych tabel; po prostu ZMIEŃ zapytanie w procedurze przechowywanej, która wywołuje tę procedurę przechowywaną SQLCLR
- pozwalają na ponowne mapowanie pól, jeśli jest to kiedykolwiek potrzebne
AKTUALIZACJA dotycząca minimalnie zarejestrowanych operacji za pośrednictwem SqlBulkCopy
Możliwe jest uzyskanie minimalnie zarejestrowanych operacji, ale powinieneś wiedzieć:
- Musisz użyć opcji TableLock Bulk Copy
- W ten sposób, w przypadku tabel z indeksami klastrowymi, najpierw załaduj dane do,
[tempdb]
a następnie wykonaj uporządkowane wstawianie do miejsca docelowego. W związku z tym wiąże się to z dodatkowym obciążeniem, zarówno fizycznym we / wy do tempdb (pliki danych i dziennika), jak i operacją sortowania (ze względu na to, ORDER BY
która jest wymagana do uzyskania minimalnie rejestrowanych operacji)
- Niektóre wyniki testów tutaj: Oficjalny dokument: wydajność SqlBulkCopy
- Niektóre wyniki testów tutaj: Rozwiązywanie problemów z SqlBulkCopy nie robi minimalnego rejestrowania