วิธีดำเนินการ SQL กับฐานข้อมูลทั้งหมดบนเซิร์ฟเวอร์


38

ฉันมี SQL มาตรฐานบางตัวที่ฉันรันกับหลายฐานข้อมูลบนเซิร์ฟเวอร์เดียวเพื่อช่วยฉันวินิจฉัยปัญหา:

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

ฉันจะดำเนินการนี้กับฐานข้อมูลทั้งหมดในเซิร์ฟเวอร์เดียวได้อย่างไร (นอกเหนือจากการเชื่อมต่อด้วยตนเองทีละครั้งและดำเนินการ)


คุณอาจพบms_foreachdb ทางเลือกนี้มีประโยชน์เช่นกัน
Nomad

คำตอบ:


44

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

หมายเหตุ:

  1. ? จะถูกแทนที่ในแบบสอบถามเป็นชื่อฐานข้อมูลดังนั้นโครงสร้างแบบสอบถามเพื่อกำหนดฐานข้อมูลที่จะสืบค้นอย่างชัดเจน
  2. แก้ไขเพื่อใช้ sys.all_sql_modules ถือเป็นข้อความโมดูลที่สมบูรณ์ (syscomments สามารถแยกคำหลักเมื่อถึงทอดข้ามแถว)

sp_MSforeachdb บางครั้งอาจมีข้อผิดพลาดดังนั้นโปรดดูลิงก์ที่ให้ไว้ในคำตอบของ Pradeep
Eric Humphrey - lotsahelp

sp_MSForEachDB นั้นดูดีสำหรับแบบสอบถามอย่างรวดเร็ว มีวิธีที่ฉันสามารถให้มันแสดงว่าฐานข้อมูลแต่ละผลลัพธ์มาจากไหน?
Diskdrive

@Diskdrive: เพิ่ม, ''?'' AS DBNameไปยังคำสั่งที่เลือก ตามตัวอย่างของฉัน
gbn

9

เพียง $ 0.05 ของฉัน: SQL Multi Script (การดำเนินการหลายสคริปต์กับเซิร์ฟเวอร์ SQL หลายตัว)


1
คำตอบเช่นนี้การรับรองโซลูชันเชิงพาณิชย์ควรถูกห้ามดังนั้น!
Fandango68

2
@ Fandango68 ฉันไม่ได้ทำงานให้กับ บริษัท นั้น ฉันเพิ่งใช้เครื่องมือนี้ ไม่มีความขัดแย้งทางผลประโยชน์แล้วคุณล่ะ? )
garik

4
@ Fandango68 ฉันต้องการพวกเขาไม่ได้ โซลูชั่นที่ดีที่สุดควรได้รับการพิจารณาและโซลูชั่นฟรีที่ดีที่สุดชั่งน้ำหนักกับพวกเขา
พอล


2

มีวิธีการเพิ่มเติมที่จะให้ผลลัพธ์ในชุดผลลัพธ์กึ่งผสานเดียว ก่อนเปิดเซิร์ฟเวอร์ที่ลงทะเบียนและสร้างกลุ่มใหม่ภายใต้ Local Server Groups จากนั้นลงทะเบียนเซิร์ฟเวอร์ของคุณหนึ่งครั้งสำหรับแต่ละฐานข้อมูลในแต่ละกรณีให้ตั้งค่าฐานข้อมูลเริ่มต้นเป็นกลุ่มที่ต้องการ

เมื่อคลิกขวาที่กลุ่มของคุณแล้วเลือกแบบสอบถามใหม่ หน้าต่างแบบสอบถามที่เปิดขึ้นจะมี "หลาย" โดยปกติคุณจะเห็นชื่อเซิร์ฟเวอร์บนแถบสถานะ แบบสอบถามใด ๆ ที่ทำงานในหน้าต่างนี้จะทำงานบนเซิร์ฟเวอร์ที่ลงทะเบียนแต่ละรายการที่อยู่ในกลุ่ม คอลัมน์แรกของผลลัพธ์จะเป็นชื่อของเซิร์ฟเวอร์ที่ลงทะเบียน ชุดผลลัพธ์จะมีการแยกส่วนตามคอลัมน์แรกนั้นและการเรียงลำดับตามความประสงค์จะดำเนินการภายในส่วนนั้นเท่านั้น

ฟังก์ชั่นการทำงานที่ทรงพลังมาก แต่ถูกมองข้ามเมื่อคุณต้องเรียกใช้ SQL เดียวกันบนเซิร์ฟเวอร์หลายเครื่องเป็นประจำ


ฉันใช้มันเยอะมากและมันเป็นคุณสมบัติที่ยอดเยี่ยมใน SSMS ข้อเสียคือมันมีไว้สำหรับการใช้งานด้วยตนเองเท่านั้นดังนั้นจึงไม่มีประโยชน์หากคุณต้องการให้บางสิ่งบางอย่างทำงานโดยอัตโนมัติ
Sir Swears-a-lot

1

บริษัท ของฉันได้มีการพัฒนาเครื่องมือที่เรียกว่าxSQL สคริปต์ปฏิบัติการ มันฟรีสำหรับการใช้งานส่วนตัวและสำหรับฉันมันทำให้การปรับใช้สคริปต์กับเป้าหมายหลายอย่างง่ายมาก


นี่เป็นโปรแกรมที่ยอดเยี่ยม! ใช้งานง่ายและใช้งานง่าย
Sean Perkins

0

ฉันพัฒนาเครื่องมือนี้: https://github.com/andreujuanc/TakoDeploy

ฉันยังคงเขียนบางบรรทัดบนมัน แต่มันค่อนข้างเสถียรในตอนนี้ ฉันใช้มันกับฐานข้อมูลการผลิตและใช้งานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.