sp_MSForEachDB
ทางเลือกหนึ่งคือsp_MSForEachDB มันไม่มีเอกสาร แต่มีประโยชน์อย่างไรก็ตาม
DECLARE @command varchar(1000)
SELECT @command =
'USE [?] UPDATE Table1 SET Field1 = ''ninjas'' WHERE Field2 = ''pirates'''
EXEC sp_MSforeachdb @command
การค้นหา interwebs มีตัวอย่างอีกมากมายเช่นกัน
หมายเหตุ:การเป็นฟังก์ชั่นที่ไม่รองรับ (ซึ่งมีข้อบกพร่องบางอย่างที่รู้จัก) คุณอาจต้องการเขียนเวอร์ชั่นของคุณเอง(ขอบคุณ @Pradeep)
ตัวอย่าง SQL ข้างต้นจำเป็นต้องปรับโครงสร้างใหม่ดังนี้:
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
หมายเหตุ:
- ? จะถูกแทนที่ในแบบสอบถามเป็นชื่อฐานข้อมูลดังนั้นโครงสร้างแบบสอบถามเพื่อกำหนดฐานข้อมูลที่จะสืบค้นอย่างชัดเจน
- แก้ไขเพื่อใช้ sys.all_sql_modules ถือเป็นข้อความโมดูลที่สมบูรณ์ (syscomments สามารถแยกคำหลักเมื่อถึงทอดข้ามแถว)