วิธีการระบุขั้นตอนการจัดเก็บทั้งหมดอ้างอิงตารางเฉพาะ


136

ฉันสร้างตารางเกี่ยวกับสภาพแวดล้อมการพัฒนาเพื่อจุดประสงค์ในการทดสอบและมี sp ไม่กี่ตัวที่อ้างอิงตารางนี้ ตอนนี้ฉันต้องวางตารางนี้รวมทั้งระบุ sp ทั้งหมดที่อ้างอิงตารางนี้ ฉันกำลังประสบปัญหาในการค้นหารายชื่อ sp ทั้งหมด กรุณาแนะนำแบบสอบถามโดยสมมติว่าชื่อตารางคือ 'x' และฐานข้อมูลคือ sql server 2005




1
ถึงผู้เชี่ยวชาญ: แล้วสำหรับเซิร์ฟเวอร์ที่ไม่ใช่ MS SQL ล่ะ?
Deian

คำตอบ:


259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

BTW - นี่คือแหล่งข้อมูลที่มีประโยชน์สำหรับคำถามประเภทนี้: การสอบถามคำถามที่พบบ่อยเกี่ยวกับ SQL Server System Catalog


3
มีเหตุผลใดที่จะทำสิ่งนี้ในการเข้าถึงROUTINE_DEFINITIONบนINFORMATION_SCHEMA.ROUTINES?
Marie

1
@Marie - SQL-Server 2005 (AFAIK) ไม่มีสิ่งนั้น
โซ่

2
คำถามโซลูชันนี้ค้นหาอ็อบเจ็กต์ที่อ้างอิงเมื่อถูกอ้างอิงภายในสตริงหรือไม่ ชอบset @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark

1
@ Jeff.Clark - มีวิธีง่ายๆในการค้นหา :-) - แต่ใช่มันค้นหาข้อความของขั้นตอนโดยตรงดังนั้นจะพบว่า
โซ่

2
ใช่ใช่ :) ฉันต้องใช้เวลาสักพักในการตั้งค่าการทดสอบและฉันก็แค่มองหาคำตอบที่ขี้เกียจ / ง่าย :)
Jeff.Clark

27

ต่อไปนี้ใช้ได้กับ SQL2008 ขึ้นไป แสดงรายการของทั้งกระบวนงานและฟังก์ชันที่จัดเก็บไว้

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name

1
OP ต้องการคำตอบสำหรับ SQL-Server-2005
Chains

19

บางครั้งข้อความค้นหาข้างต้นจะไม่ให้ผลลัพธ์ที่ถูกต้องมีขั้นตอนการจัดเก็บในตัวเพื่อให้ได้การอ้างอิงตารางเป็น:

EXEC sp_depends @objname = N'TableName';

1
สำหรับฉันสิ่งนี้แสดงให้เห็นทริกเกอร์และมุมมอง แต่ไม่ได้จัดเก็บ procs
NealWalters

1
หมายเหตุ: ฉันรันสิ่งนี้บนระบบที่ฉันสามารถเข้าถึงตารางได้ แต่ไม่ใช่ Stored Procs ดังนั้น Stored Procs จึงไม่ปรากฏในผลลัพธ์
NealWalters

18

วิธีที่ไม่ใช่แบบสอบถามคือการใช้ Sql Server Management Studio

ค้นหาตารางคลิกขวาแล้วเลือก "ดูการอ้างอิง"

แก้ไข

แต่อย่างที่ผู้แสดงความคิดเห็นกล่าวว่ามันไม่น่าเชื่อถือมากนัก


4
ในปี 2548 ข้อมูลการอ้างอิงไม่น่าเชื่อถือหากไม่ได้สร้างวัตถุตามลำดับที่ถูกต้อง
Martin Smith

3
ดังที่ @Martin Smith กล่าวไว้โพรซีเดอร์ที่เก็บไว้ที่อ้างถึงอ็อบเจ็กต์ที่ไม่มีอยู่จริงจะถูกสร้างขึ้นแม้ว่าจะมีคำเตือน แต่จะไม่มีการวางรายการไว้ใน sysdepends นอกจากนี้สิ่งเดียวกันนี้ถือเป็นจริงสำหรับโพรซีเดอร์ที่เก็บไว้ที่อ้างอิงตารางในฐานข้อมูลต่างประเทศ: ไม่มีการวางรายการในระบบขึ้นอยู่กับในฐานข้อมูลใด คุณลักษณะ Antoher คือการวาง / สร้างตารางหรือมุมมองใหม่จะทำลายห่วงโซ่การพึ่งพา คุณลักษณะ ... err ... เหล่านี้ทำให้การติดตามการพึ่งพาของ SQL Server ไร้ประโยชน์มาก
Nicholas Carey

7

แบบสอบถามต่อไปนี้จะดึงชื่อกระบวนงานที่เก็บไว้ทั้งหมดและคำจำกัดความที่สอดคล้องกันของ SP เหล่านั้น

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

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


2
การสืบค้นsyscommentsในลักษณะนี้ไม่น่าเชื่อถือสำหรับขั้นตอนที่ยาวเนื่องจากจะแบ่งคำจำกัดความออกเป็นกลุ่มอักขระ 4000 ตัวในหลายแถว sys.sql_modulesหลีกเลี่ยงสิ่งนี้
Martin Smith

1
จุดดี. ฉันได้อัปเดตให้ใช้sys.sql_modulesแทนแล้ว
Tom H

3
syscomments ถูก debunked ในทุกๆโหลของฉันหรือมากกว่านั้นคำตอบสำหรับคำถามเดียวกันstackoverflow.com/…
gbn

5

แบบสอบถามด้านล่างใช้งานได้เฉพาะเมื่อค้นหาการอ้างอิงบนตารางไม่ใช่คำค้นหาในคอลัมน์:

EXEC sp_depends @objname = N'TableName';

อย่างไรก็ตามแบบสอบถามต่อไปนี้เป็นตัวเลือกที่ดีที่สุดหากคุณต้องการค้นหาการอ้างอิงทุกประเภทจะไม่พลาดทุกสิ่ง ให้ข้อมูลมากกว่าที่ต้องการจริงๆ

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

1
สำหรับฉันไม่ได้ส่งคืนอะไรใน SSMS 2014 ที่ทำงานกับฐานข้อมูลบน SQL Server 12.0)
NealWalters

3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

วิธีนี้จะได้ผลหากคุณต้องเอ่ยชื่อตาราง


3

ในสตูดิโอการจัดการคุณสามารถคลิกขวาที่ตารางและคลิกเพื่อ 'ดูการอ้างอิง' ป้อนคำอธิบายภาพที่นี่

กว่าที่คุณจะเห็นรายการวัตถุที่มีการอ้างอิงกับตารางของคุณ:ป้อนคำอธิบายภาพที่นี่


1

โดยทั่วไปคุณมี 2 ตัวเลือก:

----ตัวเลือกที่ 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

---- ตัวเลือกที่ 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

แบบสอบถามทั้ง 2 นี้จะทำให้คุณได้รับขั้นตอนการจัดเก็บทั้งหมดที่อ้างอิงตารางที่คุณต้องการ แบบสอบถามนี้อาศัยตาราง 2 sys ซึ่ง ได้แก่ sysobjects และ syscomments sysobjects คือที่เก็บชื่ออ็อบเจ็กต์ DB ทั้งหมดของคุณซึ่งรวมถึงโพรซีเดอร์ที่เก็บไว้

syscomments มีข้อความสำหรับขั้นตอนทั้งหมดของคุณ

หากคุณสอบถาม: SELECT * FROM syscomments

คุณจะมีตารางที่มี id ซึ่งเป็นการแมปกับตาราง sysobjects พร้อมข้อความที่อยู่ในโพรซีเดอร์ที่เก็บไว้เป็นคอลัมน์สุดท้าย


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