Strony

czwartek, 14 kwietnia 2011

Nieudokumentowane procedury.

Jakiś czas temu natknąłem się na dwie fajne procedurki :

    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?

2 komentarze:

  1. 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ń
  2. 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ń