Как именно sp_msforeachdb работает за кулисами?

9

Мне нужно решить проблему, с которой я столкнулся, и мне нужна помощь, чтобы понять, как sp_msforeachdb работает, чтобы преодолеть мою проблему.

Что происходит, каждый раз, когда я запускаю sp_msforeachdb, я получаю сообщение об ошибке Msg 102, Level 15, State 1, Incorrect syntax near '61'

Пример моего кода выглядит следующим образом:

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

Однако не имеет значения, какой запрос у меня есть в качестве параметра к sp_msforeachdb. Каждый раз, когда я получаю ту же ошибку. У меня есть база данных, которая начинается с «61s1d», поэтому я думаю, что у нее есть проблема с именем базы данных, но я, честно говоря, не знаю, что происходит за кулисами на sp_msforeachdb.

Вещи, чтобы отметить.

  • Это единственная база данных, которая начинается с числа
  • Я могу попробовать использовать код вроде «Если база данных похожа на«% 61% », не делайте ......», но все равно та же ошибка.
  • Я не могу проверить изменение имени базы данных - слишком много вещей связано с ней.
  • Если я создаю тестовую базу данных, которая начинается с '51', то я также получаю ошибку для этой базы данных

Как я могу преодолеть это?

Jeff.Clark
источник

Ответы:

16

Прежде всего, не используйте sp_msforeachdb, у него есть несколько известных проблем. Вам лучше использовать версию Аарона Бертрана здесь и здесь .

Однако он использует курсор, динамический SQL и замену. Вы можете посмотреть на код, используя sp_helptext.

EXEC sp_helptext sp_msforeachdb

Если вы используете этот код, это решит некоторые ваши проблемы.

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

В скобках будет указана конкретная проблема, которую вы упомянули. Однако вы столкнетесь с проблемами, если у вас есть база данных с [или] в ней.

Кеннет Фишер
источник
Интересно, используя скобки вокруг "?" в от сделал работу. Я посмотрю на версию Аарона Бертран. Вы заметили значительное снижение производительности из-за курсора?
Джефф. Clark
2
Курсоры представляют собой реальную проблему производительности, когда у вас больше нескольких строк. Если вы не приблизитесь к максимальному количеству баз данных, вы не увидите проблемы. Проблема в том, что он может пропускать базы данных. Прочитайте статью Аарона, и он углубится в детали.
Кеннет Фишер
1
Я видел, как это полностью пропускало БД более одного раза. Используйте Аарона, это намного надежнее.
Крис Груттемейер,
11

Не соглашаясь ни с чем из сказанного @Kenneth, я должен отметить, что ошибка, с которой вы столкнулись, не имеет ничего общего sp_MSForEachDB. Это связано с тем, как база данных была названа: она начинается с числа. Правила именования объектов (не только баз данных) подробно описаны на странице MSDN для идентификаторов базы данных . Если вы следуете «Правилам для регулярных идентификаторов», вам не нужно заключать эти имена в квадратные скобки или двойные кавычки. Но имена, которые выходят за рамки этих правил , должны быть приложены (всегда).

Соломон Руцкий
источник
1
Спасибо за эту информацию также - я не знал об этом ограничении. К сожалению, эта база данных была создана за десять лет до того, как я присоединился к компании :)
Jeff.Clark
@ Jeff.Clark Я не предлагал вам переименовывать базу данных, как вы упомянули в вопросе, что вы не можете ее изменить. Я просто хотел, чтобы вы (и другие) знали реальную проблему, поскольку она возникнет снова в любое время, когда вам нужно указать это имя базы данных в любом месте. А чтение этого полного набора правил может помочь вам избежать других вещей, которые потребуют, чтобы имя - База данных, Таблица, Столбец, Индекс, Ограничение и т. Д. - всегда было заключено в квадратные или двойные кавычки.
Соломон Руцкий,