Як саме 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% "не роблю ......", але все-таки така ж помилка.
  • Я не можу перевірити зміну імені бази даних - занадто багато речей, пов’язаних із нею.
  • Якщо я створю тестовий db, який починається з "51", я також отримую помилку для цієї бази даних

Як я можу це подолати?

Відповіді:


16

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

Однак він використовує курсор, динамічний SQL та заміну. Насправді ви можете переглянути код за допомогою sp_helptext.

EXEC sp_helptext sp_msforeachdb

Якщо ви використовуєте цей код, він вирішить деякі ваші проблеми.

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

В дужках буде вказана конкретна проблема, яку ви згадали. Однак у вас виникнуть проблеми, якщо у вас є база даних із [або].


Цікаво, використовуючи дужки навколо "?" у з робили працювали. Я перегляну версію Аарона Бертранда. Ви помітили значне погіршення продуктивності через курсор?
Jeff.Clark

2
Курсори - це справжня проблема продуктивності, коли у вас більше кількох рядків. Якщо ви не наблизилися до максимального числа баз даних, ви не побачили б проблеми. Проблема в тому, що вона може пропускати бази даних. Прочитайте статтю Аарона, і він піде більш детально.
Кеннет Фішер

1
Я бачив, як це повністю пропускає БД не один раз. Використовуйте Aaron's, це набагато надійніше.
Kris Gruttemeyer

11

Не погоджуючись ні з чим, що сказав @Kenneth, я повинен зазначити, що помилка, з якою ви стикаєтеся, не має нічого спільного sp_MSForEachDB. Це пов'язано з тим, як була названа База даних: вона починається з числа. Правила іменування об'єктів (не лише Баз даних) детально описані на сторінці MSDN для ідентифікаторів баз даних . Якщо ви дотримуєтесь "Правил регулярних ідентифікаторів", вам не потрібно вкладати ці імена у квадратні дужки або подвійні лапки. Але імена, які не відповідають цим правилам , потрібно обов'язково додавати (завжди).


1
Дякую також за цю інформацію - я не знав про це обмеження. На жаль, ця база була створена за десять років до того, як я приєднався до компанії :)
Jeff.Clark

@ Jeff.Clark Я не пропонував вам перейменувати БД, як ви згадували в питанні, що ви не можете її змінити. Я просто хотів, щоб ви (та інші) дізналися про актуальну проблему, оскільки вона з’явиться знову, коли вам потрібно вказувати це ім’я бази даних де завгодно. І перечитавши цей повний набір правил, можна допомогти вам уникнути інших речей, для яких потрібне ім’я - База даних, Таблиця, Стовпець, Індекс, Обмеження тощо - завжди міститись у квадратних дужках або подвійних лапках.
Соломон Руцький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.