SQL Server - где находится "sys.functions"? - PullRequest
96 голосов
/ 22 января 2009

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

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

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

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

Ура, Marc

Ответы [ 10 ]

108 голосов
/ 22 января 2009

Я считаю, что 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
36 голосов
/ 22 января 2009

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

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

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

17 голосов
/ 01 марта 2011

Это действительно в 2008 R2 для того, что генерирует SSMS при сценарии 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
*/
5 голосов
/ 22 января 2009

Это немного более многословно, но это должно сделать то же самое:

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

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

4 голосов
/ 27 января 2014

попробуйте это:

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
4 голосов
/ 23 мая 2011

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

select * from sys.objects where type_desc like '%fun%'
2 голосов
/ 27 марта 2014

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

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';
2 голосов
/ 08 марта 2012

Чтобы расширить ответ @ 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

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

2 голосов
/ 07 июля 2009

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

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

0 голосов
/ 03 июня 2015

SQL 2000 специфическая, небольшая корректировка для имени объекта:

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

OR

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