SQL Server - где "sys.functions"?

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

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

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

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

Cheers, Марк

Ответ 1

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

Я не уверен, что обоснование 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

Ответ 2

Другим способом перечисления функций является использование представлений INFORMATION_SCHEMA.

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

В соответствии с веб-сайтом Microsoft "Представления информационной схемы предоставляют внутренний, системный, не зависящий от таблицы вид метаданных SQL Server. Представления информационных схем позволяют приложениям работать корректно, хотя существенные изменения были внесены в базовые системные таблицы". Другими словами, основные системные таблицы могут меняться по мере обновления SQL, но представления все равно остаются прежними.

Ответ 3

Это действительно в 2008 R2 R2 за то, что SSMS генерирует, когда вы script DROP функции:

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
*/

Ответ 4

Это немного более подробный, но это должно делать то же самое:

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

Насколько я вижу, это также не в SQL Server 2008.

Ответ 5

Это не добавляет ничего нового, но я нашел следующее легче запомнить:

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

Ответ 6

попробуйте следующее:

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

Ответ 7

кстати, не хотите ли вы включить type = 'FS'?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

что соответствует элементу в sys.objects для моего UDF, который получен из внешней DLL

Ответ 8

Чтобы продлить на @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

где выше указано имя функции, ее определение и идентификатор объекта соответственно.

Ответ 9

Для более полного описания скалярных функций, включая тип владельца и возвращаемого типа:

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';

Ответ 10

SQL 2000 конкретная, небольшая настройка для имени объекта:

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

ИЛИ

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