Вопрос

SQL Server 2005 имеет отличные представления sys.XXX в системном каталоге, которые я часто использую.

Что меня смущает, так это это:почему существует представление "sys.procedures" для просмотра информации о ваших хранимых процедурах, но нет представления "sys.functions", чтобы увидеть то же самое для ваших хранимых функций?

Неужели никто не использует хранимые функции?Я нахожу их очень удобными, например, длявычисляемые столбцы и тому подобное!

Есть ли конкретная причина, по которой отсутствует sys.functions, или это просто что-то, что не считалось достаточно важным для включения в представления системного каталога??Доступен ли он в SQL Server 2008??

Приветствия, Марк

Это было полезно?

Решение

Я нахожу UDFS очень удобными, и я использую их постоянно.

Я не уверен, чем обоснован отказ Microsoft от включения эквивалента 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'

Согласно веб-сайту Microsoft "Представления информационной схемы обеспечивают внутреннее, независимое от системной таблицы представление метаданных SQL Server.Представления информационной схемы позволяют приложениям корректно работать, несмотря на то, что в базовые системные таблицы были внесены значительные изменения".Другими словами, базовые системные таблицы могут меняться по мере обновления 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'

кстати, разве вы не хотели бы включить type = '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')

или

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top