Sp_msforeachdb sahne arkasında tam olarak nasıl çalışır?


9

Yaşadığım bir sorunu gidermem gerekiyor ve sorunumun üstesinden gelmek için sp_msforeachdb'nin nasıl çalıştığını anlamak için yardıma ihtiyacım var.

Ne zaman sp_msforeachdb çalıştırdığımda bir hata alıyorum Msg 102, Level 15, State 1, Incorrect syntax near '61'

Koduma bir örnek şöyledir:

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

Ancak, hangi sorgu sp_msforeachdb için bir parametre olarak sahip olduğu önemli değil. Her defasında aynı hatayı alıyorum. Ben DB adı ile ilgili bir sorun olduğunu düşünüyorum yapar '61s1d' ile başlayan bir veritabanı var, ama dürüstçe sp_msforeachdb perde arkasında neler olduğunu bilmiyorum.

Unutulmaması gereken şeyler.

  • Bir sayı ile başlayan tek veritabanı
  • "Veritabanı '% 61%' gibi yapmayın ......" gibi kod kullanmaya çalışabilirsiniz, ama yine de aynı hata.
  • Veritabanı adını değiştirerek test edemiyorum - çok fazla şey bağlı.
  • '51' ile başlayan bir test db oluşturursam, o veritabanı için de hatayı alıyorum

Bunun üstesinden nasıl gelebilirim?

Yanıtlar:


16

Her şeyden önce sp_msforeachdb kullanmayın, bilinen birkaç sorunu vardır. Aaron Bertrand'ın sürümünü burada ve burada kullanmanız daha iyi olur .

Ancak bir imleç, dinamik SQL ve bir değiştirme kullanır. Aslında koda sp_helptext kullanarak bakabilirsiniz.

EXEC sp_helptext sp_msforeachdb

Bu kodu kullanırsanız bazı sorunlarınız çözülür.

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

Parantezler, bahsettiğiniz özel sorun olacaktır. Bununla birlikte, içinde [veya] bulunan bir veritabanınız varsa sorunlarla karşılaşırsınız.


İlginç, "?" içinde işe yaradı. Aaron Bertrand'ın versiyonuna bakacağım. İmleç nedeniyle performansta önemli bir düşüş olduğunu fark ettiniz mi?
Jeff.Clark

2
İmleçler yalnızca birkaç satırdan fazlasına sahip olduğunuzda gerçek bir performans sorunudur. İzin verilen maksimum veritabanı sayısına yaklaşmadığınız sürece bir sorun görmezsiniz. Sorun, veritabanlarını atlayabilmesidir. Aaron'un makalesini okuyun ve daha ayrıntılı olarak ele alın.
Kenneth Fisher

1
Ben DBs tamamen birden fazla vesileyle atlamak gördüm. Aaron's kullan, çok daha güvenilir.
Kris Gruttemeyer

11

@Kenneth'in söylediği hiçbir şeye katılmıyorum, karşılaştığınız hatanın bir ilgisi olmadığını belirtmeliyim sp_MSForEachDB. Veritabanının nasıl adlandırıldığından kaynaklanmaktadır: bir sayı ile başlar. Nesneleri adlandırma kuralları (yalnızca Veritabanları değil), Veritabanı Tanımlayıcıları için MSDN sayfasında ayrıntılı olarak açıklanmıştır . Eğer "Normal tanımlayıcıları için Kurallar" izlerseniz o zaman yok gerek köşeli parantez veya çift tırnak içinde bu isimleri içine alın. Ama bu kurallar dışında kalan isimler yok (her zaman) içine alınması gerekir.


1
Bu bilgi için de teşekkür ederim - bu kısıtlamanın farkında değildim. Ne yazık ki bu veritabanı şirkete katılmadan on yıl önce yapıldı :)
Jeff.Clark

@ Jeff.Clark DB'yi değiştiremeyeceğiniz sorusunda belirttiğiniz gibi yeniden adlandırmanızı önermiyordum. Ben sadece (ve diğerleri) asıl sorunu bilmek istedim çünkü o Veritabanı adını her yerde belirtmeniz gerektiğinde tekrar gelecektir. Ve bu kuralların tamamını okumak, her zaman köşeli parantez veya çift tırnak içine alınacak bir ad gerektiren diğer şeylerden (Veritabanı, Tablo, Sütun, Dizin, Kısıtlama, vb.) Kaçınmanıza yardımcı olabilir.
Solomon Rutzky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.