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Ú:
- ? đượ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
- đượ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)