Cách thực thi SQL đối với tất cả các DB trên Máy chủ


38

Tôi có một số SQL chuẩn mà tôi chạy với nhiều cơ sở dữ liệu trên một máy chủ để giúp tôi chẩn đoán các vấn đề:

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

Làm thế nào tôi có thể thực hiện điều này đối với tất cả các cơ sở dữ liệu trên một máy chủ? (bên cạnh việc kết nối thủ công với từng người một và thực hiện)


Bạn cũng có thể thấy sự thay thế này của ms_foreachdb cũng hữu ích.
du mục

Câu trả lời:


44

sp_MSForEachDB

Một tùy chọn là sp_MSForEachDB . Nó không có giấy tờ nhưng dù sao cũng hữu ích

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

Một tìm kiếm của các interwebs cũng có nhiều ví dụ nữa

Lưu ý: Là một chức năng không được hỗ trợ (có một số lỗi đã biết) bạn có thể muốn viết phiên bản của riêng mình (cảm ơn @Pradeep)


Ví dụ SQL ở trên sẽ cần phải được cấu trúc lại thành:

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

GHI CHÚ:

  1. ? được thay thế trong truy vấn dưới dạng tên cơ sở dữ liệu, do đó, cấu trúc truy vấn để xác định rõ ràng DB đó là gì để truy vấn
  2. được sửa đổi để sử dụng sys.all_sql_modules khi giữ văn bản mô-đun hoàn chỉnh (syscomments có thể phân tách từ khóa khi đạt đến khoảng trên các hàng)

sp_MSforeachdb đôi khi có thể không ổn định, vì vậy hãy nhìn vào liên kết được cung cấp trong câu trả lời của Pradeep.
Eric Humphrey - lotahelp

Sp_MSForEachDB có vẻ tốt cho một truy vấn nhanh. Có cách nào tôi có thể làm cho nó hiển thị cơ sở dữ liệu mà mỗi kết quả đến từ đâu không?
Diskdrive

@Diskdrive: thêm , ''?'' AS DBNamevào bất kỳ câu lệnh chọn nào. Theo ví dụ của tôi
gbn

9

Chỉ cần $ 0,05: SQL Multi Script (thực thi nhiều tập lệnh đối với nhiều Máy chủ SQL).


1
Câu trả lời như thế này, chứng thực một giải pháp thương mại, nên bị cấm SO!
Fandango68

2
@ Fandango68 Tôi không làm việc cho công ty đó. Tôi vừa sử dụng công cụ như vậy. Không có xung đột lợi ích, còn bạn thì sao? ).
garik

4
@ Fandango68 Tôi thà họ không. Các giải pháp tốt nhất phải luôn luôn được xem xét và các giải pháp miễn phí tốt nhất cân nhắc với chúng.
Paul


2

Có một phương pháp nữa sẽ cho đầu ra trong một tập kết quả bán hợp nhất. Đầu tiên mở Máy chủ đã đăng ký và tạo một nhóm mới trong Nhóm máy chủ cục bộ sau đó đăng ký máy chủ của bạn một lần cho mỗi DB, trong mỗi trường hợp đặt DB mặc định thành một DB mong muốn.

Sau khi hoàn thành, nhấp chuột phải vào nhóm của bạn và chọn Truy vấn mới. Cửa sổ truy vấn mở ra sẽ có "nhiều" trong đó bạn thường thấy tên máy chủ trên thanh trạng thái. Mọi truy vấn chạy trong cửa sổ này sẽ hoạt động trên mỗi máy chủ đã đăng ký trong nhóm. Cột đầu tiên của kết quả sẽ là tên của máy chủ đã đăng ký. Tập kết quả sẽ được phân đoạn theo cột đầu tiên và thứ tự theo di chúc chỉ hoạt động trong đoạn đó.

Phần chức năng rất mạnh nhưng bị bỏ qua khi bạn thường xuyên phải chạy cùng một SQL trên nhiều máy chủ.


Tôi sử dụng nó rất nhiều và đó là một tính năng tuyệt vời trong SSMS. Nhược điểm là nó chỉ dành cho sử dụng thủ công, vì vậy không hữu ích nếu bạn muốn tự động hóa một cái gì đó để chạy thường xuyên.
Ngài Swears-a-lot

1

Công ty của tôi đã phát triển một công cụ có tên là xQuery Script Executor . Nó là miễn phí cho sử dụng cá nhân, và đối với tôi, nó đã làm cho việc triển khai các tập lệnh trên nhiều mục tiêu trở nên rất dễ dàng.


Đây là một chương trình tuyệt vời! Dễ sử dụng và trực quan.
Sean Perkins

0

Tôi đã phát triển công cụ này: https://github.com/andreujuanc/TakoDeploy

Tôi vẫn đang viết một số dòng trên đó, nhưng bây giờ nó khá ổn định. Tôi đã sử dụng nó chống lại cơ sở dữ liệu sản xuất và hoạt động như một cơ duyên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.