SP_MSFOREACHDB
SP_MSFOREACHTABLE
Są to dwie nieudokumentowane przez MS procedury SQL.
Za pomocą pierwszej z nich można wykonać kod SQL na wszystkich bazach danej instancji. Za pomocą drugiej na wszystkich tabelach danej bazy.
Postanowiłem zwrócić uwagę na te dwie procedurki, bo ułatwiają pracę. Zwłaszcza moją :).
Ostatnio miałem przypadek, że musiałem porównać wartości w jednej z tabelek we wszystkich bazach na danej instacji. Baz było dokładnie 358.
Prosty skrypcik i wynik był gotowy :
EXECUTE SP_MSFOREACHDB 'SELECT ''?'', * FROM ?.DBO.TABELA'
? – Zastępuje w tym przypadku nazwę bazy. W procedurze SP_MSFOREACHTABLE byłaby to nazwa tabeli.
Taki prosty kod, który zwraca nam już potrzebne informacje ze wszystkich baz, można rozbudować według własnych potrzeb. Można wyniki wrzucić do tabeli tymczasowej i już dalej na niej operować. Co istotne, błędy nie są istotne w tej procedurze ;). Tzn. jeżeli danej tabeli nie na bazie to zgłoszony zostanie błąd wykonania zapytania, ale cała procedura pojedzie dalej i zwróci nam wyniki dla baz, dla których tabela istnieje.
Szkoda tylko, że procedury nie są udokumentowane i w sumie nie wiadomo czy będą rozwijane. Może się okazać, że znikną w kolejnych wersjach MS SQL. Oby nie.
Jeden ze znajomych powiedział mi, że ważne jest na koniec posta zadać czytelnikom pytanie :). Pytam więc, czy też czujecie nieocenioną radość przy korzystaniu z powyższych procedur?
Mimo wszystko momentami lepiej używać kursorów. Zwłaszcza, jeśli korzystasz z Central Management Servers. Większa kontrola i odrobinę mniej "ciapków" :-)
OdpowiedzUsuńTo fakt. Ilość "ciapków" jest dość duża. Nawet ostatnio jeden z programistów (C#), który raczkuje w SQL, zapytał mnie czy tyle "ciapków" na pewno potrzeba ;)
OdpowiedzUsuń