سؤال

لدي قاعدة بيانات ضخمة تحتوي على مئات الجداول والإجراءات المخزنة.باستخدام SQL Server 2005، كيف يمكنني الحصول على قائمة بالإجراءات المخزنة التي تقوم بعملية إدراج أو تحديث في جدول معين.

هل كانت مفيدة؟

المحلول

select
  so.name,
  sc.text
from
  sysobjects so inner join syscomments sc on so.id = sc.id
where
  sc.text like '%INSERT INTO xyz%'
  or sc.text like '%UPDATE xyz%'

سيعطيك هذا قائمة بجميع محتويات الإجراءات المخزنة مع INSERT أو UPDATE لجدول معين (من الواضح أنه يمكنك تعديل الاستعلام ليناسب).سيتم أيضًا تقسيم الإجراءات الأطول عبر صفوف متعددة في مجموعة السجلات التي تم إرجاعها، لذا قد تحتاج إلى إجراء القليل من التدقيق اليدوي خلال النتائج.

يحرر:تم تعديل الاستعلام لإرجاع اسم SP أيضًا.لاحظ أيضًا أن الاستعلام أعلاه سيُرجع أي UDFs بالإضافة إلى SPs.

نصائح أخرى

sys.sql_dependencies يحتوي على قائمة بالكيانات ذات التبعيات، بما في ذلك الجداول والأعمدة التي يتضمنها sproc في الاستعلامات.يرى هذا المشنور للحصول على مثال لاستعلام يخرج التبعيات.سيحصل مقتطف الكود أدناه على قائمة بتبعيات الجدول/العمود حسب الإجراء المخزن

select sp.name       as sproc_name
      ,t.name        as table_name
      ,c.name        as column_name
 from sys.sql_dependencies d
 join sys.objects t
   on t.object_id = d.referenced_major_id
 join sys.objects sp
   on sp.object_id = d.object_id
 join sys.columns c
   on c.object_id = t.object_id
  and c.column_id = d.referenced_minor_id
where sp.type = 'P'

استخدم sys.dm_sql_referencing_entities

لاحظ أن sp_depends قديم.

مرجع MSDN

يمكنك محاولة تصدير جميع إجراءاتك المخزنة إلى ملف نصي ثم استخدام بحث بسيط.

تتمثل الطريقة الأكثر تقدمًا في استخدام بحث regexp للعثور على جميع إدخالات SELECT FROM وINSERT FROM.

يبدو أن هذا يعمل:

select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means

إذا قمت بتنزيل sp_search_code من موقع Vyaskn، فسوف يسمح لك بالعثور على أي نص داخل كائنات قاعدة البيانات الخاصة بك.

http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm

SELECT Distinct SO.Name
FROM sysobjects SO (NOLOCK)
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
AND SO.Type = 'P'
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%')
ORDER BY SO.Name

هذا الرابط تم استخدامه كمورد للبحث في SP.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top