Bagaimana tepatnya cara sp_msforeachdb bekerja di belakang layar?


9

Saya perlu memecahkan masalah yang saya alami, dan saya butuh bantuan untuk memahami bagaimana sp_msforeachdb bekerja untuk mengatasi masalah saya.

Apa yang terjadi adalah setiap kali saya menjalankan sp_msforeachdb, saya mendapatkan kesalahan Msg 102, Level 15, State 1, Incorrect syntax near '61'

Contoh kode saya adalah sebagai berikut:

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

Namun, tidak masalah kueri apa yang saya miliki sebagai parameter untuk sp_msforeachdb. Setiap kali saya mendapatkan kesalahan yang sama. Saya memang memiliki database yang dimulai dengan '61s1d', sehingga membuat saya berpikir itu memiliki masalah dengan nama DB, tapi jujur ​​saya tidak tahu apa yang terjadi di balik layar pada sp_msforeachdb.

Hal-hal yang perlu diperhatikan.

  • Ini adalah satu-satunya basis data yang dimulai dengan angka
  • Saya dapat mencoba menggunakan kode seperti "Jika database seperti '% 61%' jangan lakukan ......", tetapi masih kesalahan yang sama.
  • Saya tidak dapat menguji mengubah nama database - terlalu banyak hal yang terhubung dengannya.
  • Jika saya membuat tes db yang dimulai dengan '51', maka saya juga mendapatkan kesalahan untuk database itu

Bagaimana saya bisa mengatasi ini?

Jawaban:


16

Pertama-tama jangan gunakan sp_msforeachdb memiliki beberapa masalah yang diketahui. Anda lebih baik menggunakan versi Aaron Bertrand .

Namun ia menggunakan kursor, SQL dinamis, dan pengganti. Anda benar-benar dapat melihat kode dengan menggunakan sp_helptext.

EXEC sp_helptext sp_msforeachdb

Jika Anda menggunakan kode ini, itu akan memperbaiki beberapa masalah Anda.

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

Kurung akan menjadi masalah khusus yang Anda sebutkan. Namun Anda akan mengalami masalah jika Anda memiliki database dengan [atau] di dalamnya.


Menarik, menggunakan tanda kurung di sekitar tanda "?" di dari berhasil. Saya akan melihat ke versi Aaron Bertrand. Pernahkah Anda memperhatikan penurunan kinerja yang signifikan karena kursor?
Jeff.Clark

2
Kursor hanya masalah kinerja nyata ketika Anda memiliki lebih dari beberapa baris. Kecuali jika Anda mendekati jumlah database maksimum, Anda tidak akan melihat masalah. Masalahnya adalah ia dapat melewati basis data. Baca artikel Harun dan dia masuk ke lebih detail.
Kenneth Fisher

1
Saya telah melihatnya melewatkan DB sepenuhnya pada lebih dari satu kesempatan. Gunakan Harun, itu jauh lebih dapat diandalkan.
Kris Gruttemeyer

11

Tidak setuju dengan apa pun yang dikatakan @Kenneth, saya harus menunjukkan bahwa kesalahan yang Anda temui tidak ada hubungannya dengan sp_MSForEachDB. Hal ini disebabkan oleh bagaimana Database itu dinamai: dimulai dengan angka. Aturan untuk penamaan objek (bukan hanya Database) dirinci di halaman MSDN untuk Pengidentifikasi Database . Jika Anda mengikuti "Aturan untuk Identifikasi Reguler" maka Anda tidak perlu menyertakan nama-nama itu dalam tanda kurung atau tanda kutip ganda. Tetapi nama-nama yang berada di luar aturan-aturan itu harus dilampirkan (selalu).


1
Terima kasih atas info ini juga - Saya tidak mengetahui batasan itu. Sayangnya database itu dibuat satu dekade sebelum saya bergabung dengan perusahaan :)
Jeff.Clark

@ Jeff.Clark Saya tidak menyarankan Anda mengganti nama DB seperti yang Anda sebutkan dalam pertanyaan bahwa Anda tidak dapat mengubahnya. Saya hanya ingin Anda (dan orang lain) mengetahui masalah yang sebenarnya karena itu akan muncul lagi kapan saja Anda perlu menentukan nama Database itu di mana saja. Dan membaca seperangkat aturan lengkap dapat membantu Anda menghindari hal-hal lain yang akan memerlukan nama - Database, Tabel, Kolom, Indeks, Kendala, dll - untuk selalu tertutup tanda kurung siku atau tanda kutip ganda.
Solomon Rutzky
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.