it-swarm.asia

Cara menjalankan SQL terhadap semua DB di Server

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)

39
Andrew Bickerton

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 sendiri versi (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 bisa pisahkan kata kunci saat menjangkau rentang lebih dari baris)
44
gbn

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

9
garik

SSMS Tools Pack melakukan ini dengan baik dan gratis untuk server basis data sebelum 2012. Fitur: "Jalankan pada Banyak Target" - http://www.ssmstoolspack.com/Features?f=6

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.

2
Paul

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

1
Endi Zhupani

Saya mengembangkan alat ini: https://github.com/andreujuanc/TakoDeploy

Saya masih menulis beberapa baris di atasnya, tetapi cukup stabil sekarang. Saya telah menggunakannya melawan database produksi dan bekerja seperti pesona.

0
Juan Carlos