Jak dokładnie działa sp_msforeachdb za kulisami?

9

Muszę rozwiązać problem, który mam, i potrzebuję pomocy w zrozumieniu, jak działa sp_msforeachdb, aby rozwiązać mój problem.

Za każdym razem, gdy uruchamiam sp_msforeachdb, pojawia się błąd Msg 102, Level 15, State 1, Incorrect syntax near '61'

Przykład mojego kodu jest następujący:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''

Jednak nie ma znaczenia, jakie zapytanie mam jako parametr sp_msforeachdb. Za każdym razem pojawia się ten sam błąd. Mam bazę danych, która zaczyna się od „61s1d”, więc myślę, że ma problem z nazwą DB, ale szczerze mówiąc, nie wiem, co dzieje się za kulisami na sp_msforeachdb.

Warto zwrócić uwagę.

  • Jest to jedyna baza danych, która zaczyna się od liczby
  • Mogę spróbować użyć kodu takiego jak „Jeśli baza danych jest jak '% 61%', nie rób ......”, ale wciąż ten sam błąd.
  • Nie mogę przetestować zmiany nazwy bazy danych - zbyt wiele rzeczy z nią związanych.
  • Jeśli utworzę testową bazę danych, która zaczyna się od „51”, to również pojawia się błąd dla tej bazy danych

Jak mogę to przezwyciężyć?

Jeff.Clark
źródło

Odpowiedzi:

16

Przede wszystkim nie używaj sp_msforeachdb ma kilka znanych problemów. Lepiej skorzystaj z wersji Aarona Bertranda tu i tutaj .

Wykorzystuje jednak kursor, dynamiczny SQL i zamień. Możesz faktycznie spojrzeć na kod za pomocą sp_helptext.

EXEC sp_helptext sp_msforeachdb

Jeśli użyjesz tego kodu, rozwiąże to niektóre z twoich problemów.

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                 FROM [?].sys.objects
                 WHERE name like ''%aetna%''

Nawiasy kwadratowe opisują konkretny problem, o którym wspomniałeś. Będziesz jednak mieć problemy, jeśli masz bazę danych z [lub] w niej.

Kenneth Fisher
źródło
Interesujące, używając nawiasów wokół „?” w od pracy. Zajrzę do wersji Aarona Bertranda. Czy zauważyłeś znaczny spadek wydajności z powodu kursora?
Jeff.Clark
2
Kursory stanowią prawdziwy problem z wydajnością, gdy masz więcej niż kilka wierszy. Dopóki nie zbliżysz się do maksymalnej liczby baz danych, nie zobaczysz problemu. Problem polega na tym, że może on pomijać bazy danych. Przeczytaj artykuł Aarona, a on zagłębi się bardziej szczegółowo.
Kenneth Fisher
1
Widziałem, jak pomija DB całkowicie przy więcej niż jednej okazji. Użyj Aarona, jest o wiele bardziej niezawodny.
Kris Gruttemeyer,
11

Nie zgadzając się z niczym, co powiedział @Kenneth, powinienem zauważyć, że napotkany błąd nie ma nic wspólnego sp_MSForEachDB. Wynika to z nazwy bazy danych: zaczyna się od liczby. Reguły nazewnictwa obiektów (nie tylko baz danych) są szczegółowo opisane na stronie MSDN dla identyfikatorów baz danych . Jeśli przestrzegasz „Reguł dla zwykłych identyfikatorów”, nie musisz umieszczać tych nazw w nawiasach kwadratowych lub podwójnych cudzysłowach. Ale nazwy, które nie są zgodne z tymi regułami , muszą być dołączone (zawsze).

Solomon Rutzky
źródło
1
Dziękuję również za te informacje - nie byłem świadomy tego ograniczenia. Niestety ta baza danych została stworzona dekadę przed dołączeniem do firmy :)
Jeff.Clark
@ Jeff.Clark Nie sugerowałem, aby zmienić nazwę bazy danych, jak wspomniałeś w pytaniu, że nie możesz jej zmienić. Chciałem tylko, abyś ty (i inni) znali rzeczywisty problem, ponieważ pojawi się ponownie za każdym razem, gdy będziesz musiał podać nazwę bazy danych w dowolnym miejscu. A przeczytanie pełnego zestawu reguł pomoże ci uniknąć innych rzeczy, które będą wymagały nazwy - bazy danych, tabeli, kolumny, indeksu, ograniczenia itp. - aby zawsze były ujęte w nawiasy kwadratowe lub cudzysłowy.
Solomon Rutzky