SQL bir Sunucudaki tüm DB'lere karşı nasıl çalıştırılır


38

Sorunları teşhis etmeme yardımcı olmak için tek bir sunucuda birden çok veritabanına karşı çalıştırdığım bazı standart SQL'ler var:

select 
    so.name,
    so.type,
    MAX(case when sc.text like '%remote%' then '' ELSE 'N' END) AS Relevant,
    @@ServerName as Server,
    DB_Name() as DBName 
from
    sysobjects so with (nolock)
    join syscomments sc with (nolock) on so.id = sc.id
where (sc.text like '%emote%')
group by so.name, so.type
order by so.type, so.name

Bunu, tüm veritabanlarına karşı tek bir sunucuda nasıl uygulayabilirim? (aynı anda bir tanesine manuel olarak bağlanmak ve yürütmek dışında)


Sen bulabilirsiniz bu ms_foreachdb kullanışlı alternatifini de.
Nomad

Yanıtlar:


44

sp_MSForEachDB

Bir seçenek sp_MSForEachDB'dir . Belgelenmemiş ancak yine de yararlı

DECLARE @command varchar(1000) 
SELECT @command = 
    'USE [?] UPDATE Table1 SET Field1 = ''ninjas'' WHERE Field2 = ''pirates''' 
EXEC sp_MSforeachdb @command

İnterweb'lerin araştırılmasında çok daha fazla örnek var

Not: Desteklenmeyen bir işlev olarak (bilinen bazı hataları vardır) kendi sürümünüzü yazmak isteyebilirsiniz (thanks @Pradeep)


Yukarıdaki SQL örneğinin aşağıdaki gibi yeniden yapılandırılması gerekir:

DECLARE @findKeySQL nvarchar(2000)
DECLARE @searchKey nvarchar(20)

SET @searchKey = lower('%remote%')

SET @findKeySQL = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'', 
                                     ''[msdb]'', ''[tempdb]'')
        select 
            so.name,
            so.type,
            @@ServerName as Server,
            ''?'' as DBName 
        from
            [?].dbo.sysobjects so with (nolock)
            join [?].sys.all_sql_modules sc with (nolock) on so.id = sc.object_id
        where (lower(sc.definition) like ''' + @searchKey + ''')
        group by so.name, so.type
        order by so.type, so.name'

EXEC sp_MSForEachDB @findKeySQL

NOTLAR:

  1. ? Sorguda veritabanı adı olarak değiştirildiğinden, sorgunun hangi DB'ye karşı sorgulanacağını açıkça tanımlayacak şekilde yapılandırın.
  2. Kullanım sys.all_sql_modules modifiye komple modül metni (syscomments tutar gibi olabilir anahtar kelimeyi bölmek zaman satırların üzerine yayılan ulaşmak)

sp_MSforeachdb bazen lapa lapa olabilir, bu yüzden Pradeep'in cevabında verilen bağlantıya bakın.
Eric Humphrey - çok

Sp_MSForEachDB hızlı bir sorgu için iyi görünüyor. Her sonucun hangi veritabanından geldiğini gösterebilmemin bir yolu var mı?
Diskdrive

@Diskdrive: , ''?'' AS DBNameHerhangi bir select ifadesine ekleyin . Benim
örneğime göre

9

Sadece $ 0,05: SQL Çok Komut Dosyası (birden çok SQL Sunucusuna karşı çok sayıda komut dosyasının çalıştırılması).


1
Ticari bir çözümü destekleyen bu gibi cevaplar yasaklanmalı SO!
Fandango68

2
@ Fandango68 Bu şirket için çalışmıyorum. Ben sadece bu aracı kullandım. Çıkar çatışması yok, ya sen? ).
garik,

4
@ Fandango68 Onlar olmasaydı tercih ederim. Her zaman en iyi çözümler göz önünde bulundurulmalı ve onlara karşı en iyi ücretsiz çözümler tartılmalıdır.
Paul


2

Tek bir yarı birleştirilmiş sonuç kümesinde çıktı verecek başka bir yöntem daha var. Önce Kayıtlı Sunucular'ı açın ve Yerel Sunucu Grupları altında yeni bir grup oluşturun, ardından her DB için sunucunuzu bir kez kaydettirin, her durumda varsayılan DB'yi istenen gruba ayarlayın.

Tamamlandığında grubunuza sağ tıklayın ve Yeni Sorgu öğesini seçin. Açılan sorgu penceresinde normalde durum çubuğunda bir sunucu adı göreceğiniz "çoklu" olacaktır. Bu pencerede çalıştırılan tüm sorgular gruptaki kayıtlı her sunucuda çalışacaktır. Sonuçların ilk sütunu kayıtlı sunucunun adı olacaktır. Sonuç kümesi bu ilk sütun tarafından parçalanacak ve irade sırası yalnızca bu parça içinde çalışacaktır.

Aynı SQL'i birden fazla sunucuda rutin olarak çalıştırmak zorunda olduğunuzda çok güçlü ancak gözden kaçan bir işlevsellik parçası.


Bunu çok kullanıyorum ve SSMS'de harika bir özellik. Dezavantajı sadece manuel kullanım için olmasıdır, bu nedenle düzenli olarak çalışacak bir şeyi otomatikleştirmek istiyorsanız kullanışlı değildir.
Sir Swears-a-lot

1

Şirketim xSQL Script Executor adında bir araç geliştirdi . Kişisel kullanım için ücretsizdir ve benim için senaryoları birden çok hedefe dağıtmayı çok kolaylaştırdı.


Bu harika bir program! Kullanımı kolay ve sezgisel.
Sean Perkins,

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.