Cara menjalankan SQL terhadap semua DB di Server


38

Saya memiliki beberapa SQL standar yang saya jalankan terhadap banyak basis data pada satu server untuk membantu saya mendiagnosis masalah:

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

Bagaimana saya bisa menjalankan ini terhadap semua basis data pada satu server? (selain menghubungkan secara manual ke satu per satu dan menjalankan)


Anda mungkin menemukan ini alternatif ms_foreachdb berguna juga.
Nomad

Jawaban:


44

sp_MSForEachDB

Salah satu opsi adalah sp_MSForEachDB . Ini tidak berdokumen tetapi tetap bermanfaat

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

Pencarian jalinan memiliki banyak contoh juga

Catatan: Menjadi fungsi yang tidak didukung (yang memiliki beberapa bug yang dikenal) Anda mungkin ingin menulis versi Anda sendiri (terima kasih @Pradeep)


Contoh SQL di atas perlu direstrukturisasi sebagai:

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

CATATAN:

  1. ? diganti dalam kueri sebagai nama basis data, jadi susun kueri untuk secara eksplisit menentukan DB mana yang harus ditentang
  2. dimodifikasi untuk menggunakan sys.all_sql_modules sebagai penampung teks modul lengkap (syscomments dapat memisahkan kata kunci saat mencapai spanning over rows)

sp_MSforeachdb kadang-kadang bisa bersisik, jadi lihat tautan yang disediakan dalam jawaban Pradeep.
Eric Humphrey - lotsahelp

Sp_MSForEachDB tampaknya bagus untuk kueri cepat. Apakah ada cara saya bisa mendapatkannya untuk menunjukkan dari mana setiap hasil berasal dari database?
Diskdrive

@Diskdrive: tambahkan , ''?'' AS DBNameke pernyataan pilih apa saja. Seperti contoh saya
gbn

9

Hanya $ 0,05 saya: SQL Multi Script (pelaksanaan banyak skrip terhadap beberapa SQL Server).


1
Jawaban seperti ini, mendukung solusi komersial, harus dilarang SO!
Fandango68

2
@ Fandango68 Saya tidak bekerja untuk perusahaan itu. Saya baru saja menggunakan alat itu. Tidak ada konflik kepentingan, bagaimana dengan Anda? ).
garik

4
@ Fandango68 Saya lebih suka mereka tidak. Solusi terbaik harus selalu dipertimbangkan, dan solusi gratis terbaik membebani mereka.
Paul


2

Ada metode lebih lanjut yang akan memberikan output dalam satu set hasil semi-gabungan. Pertama buka Server Terdaftar dan buat grup baru di bawah Grup Server Lokal kemudian daftarkan server Anda satu kali untuk setiap DB, dalam setiap kasus mengatur DB default ke yang diinginkan.

Setelah selesai klik kanan pada grup Anda dan pilih Permintaan Baru. Jendela permintaan yang terbuka akan memiliki "banyak" di mana Anda biasanya akan melihat nama server pada bilah status. Setiap kueri yang dijalankan di jendela ini akan beroperasi pada setiap server terdaftar yang ada di grup. Kolom pertama hasil akan menjadi nama server terdaftar. Set hasil akan terfragmentasi oleh kolom pertama itu dan pesanan berdasarkan kehendak hanya beroperasi di dalam fragmen itu.

Sepotong fungsionalitas yang sangat kuat tetapi terabaikan ketika Anda secara rutin harus menjalankan SQL yang sama di beberapa server.


Saya sering menggunakan ini dan ini fitur hebat di SSMS. Kelemahannya adalah ini hanya untuk penggunaan manual, jadi tidak berguna jika Anda ingin mengotomatiskan sesuatu untuk berjalan secara teratur.
Sir Swears-a-lot

1

Perusahaan saya telah mengembangkan alat yang disebut Pelaksana Script xSQL . Ini gratis untuk penggunaan pribadi, dan bagi saya, itu membuat penempatan skrip pada banyak target menjadi sangat mudah.


Ini adalah program yang bagus! Mudah digunakan dan intuitif.
Sean Perkins

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.