سؤال

وSQL خادم 2005 مناظر sys.XXX كبيرة على كتالوج النظام الذي استعمل في كثير من الأحيان.

وماذا يتعثر لي هو هذا: لماذا هناك "sys.procedures" بغية معرفة المعلومات حول الإجراءات المخزنة، ولكن ليس هناك عرض "sys.functions" لرؤية الشيء نفسه بالنسبة ظائف المخزنة

لا أحد استخدام وظائف تخزينها؟ أجدها مفيدة جدا لمثل الأعمدة المحسوبة وعلى هذا الأساس!

هل هناك سبب معين sys.functions مفقود، أم أنها مجرد شيء لا يعتبر مهمة بما يكفي لوضعها في وجهات النظر تميز الكلية كتالوج ؟؟ هو متاح في SQL Server 2008؟

وابتهاج، مارك

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

المحلول

وأجد UDFS ومفيد جدا وأنا استخدامها في كل وقت.

ولست متأكدا ما هو المنطق مايكروسوفت ليست بما في ذلك sys.functions يعادل في SQL Server 2005 (أو SQL Server 2008، بقدر ما استطيع ان اقول)، ولكن من السهل بما فيه الكفاية للفة الخاصة بك:

CREATE VIEW my_sys_functions_equivalent
AS
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

نصائح أخرى

وهناك طريقة أخرى لقائمة المهام هي الاستفادة من وجهات النظر INFORMATION_SCHEMA.

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION'

ووفقا لموقع مايكروسوفت "توفر جهات النظر مخطط المعلومات لل، عرض داخلي نظام جدول مستقل من SQL خادم الفوقية. وجهات النظر مخطط معلومات تمكن التطبيقات لتعمل بشكل صحيح على الرغم من أن تغييرات كبيرة طرأت على جداول النظام الأساسي". وبعبارة أخرى، فإن جداول النظام الأساسي قد يتغير مع SQL يحصل على ترقية، ولكن يجب أن الآراء لا تزال هي نفسها.

وهذا صحيح في 2008 R2 في ما يولد SSMS عند النصي قطرة من وظيفة:

SELECT  *
FROM    sys.objects
WHERE   type IN (N'FN', N'IF', N'TF', N'FS', N'FT') ;

/*
From http://msdn.microsoft.com/en-us/library/ms177596.aspx:
 FN SQL_SCALAR_FUNCTION
 FS Assembly (CLR) scalar-function
 FT Assembly (CLR) table-valued function
 IF SQL_INLINE_TABLE_VALUED_FUNCTION
 TF SQL_TABLE_VALUED_FUNCTION
*/

وانها قليلا جدا أكثر مطول، ولكن هذا يجب أن تفعل نفس الشيء بالضبط:

select * from sys.objects where (type='TF' or type='FN')

وبقدر ما أستطيع أن أرى، انها ليست في SQL Server 2008 أيضا.

وهذا لا يضيف أي شيء جديد، ولكنني وجدت ما يلي أسهل أن نتذكر:

select * from sys.objects where type_desc like '%fun%'

وحاول هذا:

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'

وبالمناسبة، لا تريد لتشمل نوع = 'FS؟

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

وهذا ما هذا البند في sys.objects يتوافق مع لUDF بلدي وهي مشتقة من DLL خارجي

لتمديد عليها @ LukeH في الجواب، لإعادة تعريف وظيفة يتطلب فضلا عن الانضمام إلى طاولة sys.sql_modules. لذا الاستعلام في ذلك هو:

SELECT O.name as 'Function name', M.definition as 'Definition', O.object_id
FROM sys.objects as O INNER JOIN sys.sql_modules as M
    ON O.object_id = M.object_id
WHERE type IN ('FN', 'IF', 'TF')  -- scalar, inline table-valued, table-valued

وحيث يعرض أعلاه اسم الدالة، تعريفه ومعرف الكائن على التوالي.

لوصف أوفى من الدالات العددية بما في ذلك مالك وعودة نوع:

SELECT f.name, s.name AS owner, t.name as dataType, p.max_length, p.precision, p.scale, m.definition
FROM sys.objects f
JOIN sys.schemas s on s.schema_id = f.schema_id
JOIN sys.parameters p on p.object_id = f.object_id AND p.parameter_id = 0
JOIN sys.types t ON t.system_type_id = p.system_type_id 
JOIN sys.sql_modules as m ON m.object_id = f.object_id
WHERE type='FN';

وSQL 2000، تعديل طفيف محدد لاسم الكائن:

SELECT *
FROM sysobjects
WHERE type IN ('FN', 'IF', 'TF')

وOR

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top