sp_msforeachdb ทำงานอย่างไรเบื้องหลัง?


9

ฉันต้องการแก้ไขปัญหาที่ฉันมีและต้องการความช่วยเหลือในการทำความเข้าใจวิธีการทำงานของ sp_msforeachdb เพื่อที่จะเอาชนะปัญหาของฉัน

สิ่งที่เกิดขึ้นคือทุกครั้งที่ฉันเรียกใช้ sp_msforeachdb ฉันจะได้รับข้อผิดพลาด Msg 102, Level 15, State 1, Incorrect syntax near '61'

ตัวอย่างของรหัสของฉันเป็นดังนี้:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''

อย่างไรก็ตามมันไม่สำคัญว่าเคียวรีใดที่ฉันมีเป็นพารามิเตอร์สำหรับ sp_msforeachdb ทุกครั้งที่ฉันได้รับข้อผิดพลาดเดียวกัน ฉันมีฐานข้อมูลที่ขึ้นต้นด้วย '61s1d' ดังนั้นฉันคิดว่ามันมีปัญหากับชื่อ DB แต่โดยสุจริตฉันไม่รู้ว่าเกิดอะไรขึ้นเบื้องหลังของ sp_msforeachdb

สิ่งที่ควรทราบ

  • มันเป็นฐานข้อมูลเดียวที่เริ่มต้นด้วยตัวเลข
  • ฉันสามารถลองใช้รหัสเช่น "ถ้าฐานข้อมูลเป็น '% 61%' อย่าทำ ...... " แต่ก็ยังมีข้อผิดพลาดเดียวกัน
  • ฉันไม่สามารถทดสอบการเปลี่ยนชื่อฐานข้อมูล - มีการเชื่อมต่อกับหลายสิ่งมากเกินไป
  • ถ้าฉันสร้างฐานข้อมูลทดสอบที่ขึ้นต้นด้วย '51' ฉันจะได้รับข้อผิดพลาดสำหรับฐานข้อมูลนั้นด้วย

ฉันจะเอาชนะสิ่งนี้ได้อย่างไร

คำตอบ:


16

ก่อนอื่นไม่ใช้ sp_msforeachdb มันมีปัญหาที่รู้จักกันหลายประการ คุณควรใช้รุ่นของ Aaron Bertrand ที่นี่และที่นี่ดีกว่า

อย่างไรก็ตามมันใช้เคอร์เซอร์ SQL แบบไดนามิกและการแทนที่ คุณสามารถดูรหัสได้โดยใช้ sp_helptext

EXEC sp_helptext sp_msforeachdb

ถ้าคุณใช้รหัสนี้มันจะแก้ไขปัญหาของคุณ

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                 FROM [?].sys.objects
                 WHERE name like ''%aetna%''

วงเล็บจะเป็นปัญหาเฉพาะที่คุณพูดถึง อย่างไรก็ตามคุณจะพบปัญหาหากคุณมีฐานข้อมูลที่มี [หรือ] อยู่ในนั้น


ที่น่าสนใจคือใช้เครื่องหมายวงเล็บล้อมรอบเครื่องหมาย "?" ในจากทำงาน ฉันจะตรวจสอบเวอร์ชันของ Aaron Bertrand คุณสังเกตเห็นว่าประสิทธิภาพการทำงานลดลงอย่างมีนัยสำคัญเนื่องจากเคอร์เซอร์?
Jeff.Clark

2
เคอร์เซอร์เป็นปัญหาประสิทธิภาพที่แท้จริงเมื่อคุณมีแถวมากกว่าสองสามแถว นอกจากว่าคุณเข้าใกล้ฐานข้อมูลจำนวนสูงสุดที่อนุญาตคุณจะไม่เห็นปัญหา ปัญหาคือมันสามารถข้ามฐานข้อมูล อ่านบทความของแอรอนแล้วเขาจะลงรายละเอียดเพิ่มเติม
Kenneth Fisher

1
ฉันเคยเห็นมันข้ามฐานข้อมูลอย่างสมบูรณ์มากกว่าหนึ่งครั้ง ใช้แอรอนมันน่าเชื่อถือมากขึ้น
Kris Gruttemeyer

11

ไม่เห็นด้วยกับสิ่งที่ @Kenneth sp_MSForEachDBกล่าวว่าฉันควรจะชี้ให้เห็นว่าข้อผิดพลาดที่คุณจะพบมีอะไรจะทำอย่างไรกับ มันเป็นเพราะวิธีการตั้งชื่อฐานข้อมูล: มันเริ่มต้นด้วยตัวเลข กฎระเบียบสำหรับการตั้งชื่อวัตถุ (ไม่เพียง แต่ฐานข้อมูล) มีรายละเอียดในหน้า MSDN สำหรับตัวบ่งชี้ฐานข้อมูล หากคุณปฏิบัติตาม "กฎสำหรับตัวระบุปกติ" คุณไม่จำเป็นต้องใส่ชื่อเหล่านั้นในวงเล็บเหลี่ยมหรือเครื่องหมายคำพูดคู่ แต่ชื่อที่อยู่นอกกฎเหล่านั้นจะต้องถูกปิดล้อม (เสมอ)


1
ขอบคุณสำหรับข้อมูลนี้ด้วย - ฉันไม่ทราบถึงข้อ จำกัด ดังกล่าว แต่น่าเสียดายที่ว่าฐานข้อมูลที่ถูกสร้างขึ้นมาเป็นสิบปีก่อนที่จะร่วมงานกับ บริษัท :)
Jeff.Clark

@ Jeff.Clark ฉันไม่ได้แนะนำให้คุณเปลี่ยนชื่อฐานข้อมูลตามที่คุณพูดถึงในคำถามที่คุณไม่สามารถเปลี่ยนได้ ฉันแค่อยากให้คุณ (และคนอื่น ๆ ) รู้ปัญหาจริงเพราะมันจะเกิดขึ้นอีกครั้งเมื่อใดก็ตามที่คุณต้องระบุชื่อฐานข้อมูลนั้นทุกที่ และการอ่านกฎชุดเต็มสามารถช่วยให้คุณหลีกเลี่ยงสิ่งอื่น ๆ ที่จะต้องมีชื่อ - ฐานข้อมูลตารางคอลัมน์ดัชนีข้อ จำกัด ฯลฯ - เพื่อให้อยู่ในวงเล็บเหลี่ยมหรือเครื่องหมายคำพูดคู่เสมอ
โซโลมอน Rutzky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.