SQL Server - где «sys.functions»?

104

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

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

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

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

Привет, Марк

marc_s
источник
Ответ, предоставленный TimC (отвеченный 22 января в 14:06), предпочтительнее использования старой системной таблицы sysobjects, потому что у вас есть столбец LAST_ALTERED в INFORMATION_SCHEMA.ROUTINES, который похож на столбец modify_date, который существует в sys.tables, sys.views, sys.procedures и т. д. Однако, если вы используете более обновленное системное представление sys.objects, у вас есть modify_date, как в этих таблицах. Мои 0,02 доллара. Ура,
Мэтью
1
@JuniorMayhe: хорошо - вот отзыв о предложении Connect, который я ввел - проголосуйте за него! :-)
marc_s
1
Я думаю, что у @marc_s есть хорошая мысль: многие люди не могут понять, почему нет sys.functions. У вас sys.foreign_keysи нет sys.primary_keys. В любом случае, я прошу вас, ребята, использовать открытый канал Microsoft, чтобы предлагать и предлагать новые функции для будущих версий SQL Server на connect.microsoft.com/SQLServer/Feedback. Я уже добавил отзыв о sys.functions на connect.microsoft.com/ SQLServer / feedback / details / 1127920
Джуниор Мэйхе,

Ответы:

117

Я считаю, что 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
Лука
источник
7
Это также должно включать типы функций CLR: «AF», «FS» и «FT». См. Описание столбца «type» sys.objects
Трийнко,
4
«AF» не считается «функцией» с точки зрения метаданных объекта SQL Server, даже если это означает AGGREGATE_FUNCTION. Более очевидно, что Aggregate - это тип объекта, отличный от других пользовательских функций, если учесть, что вы создаете новый агрегат с помощью CREATE AGGREGATE вместо CREATE FUNCTION. Типы объектов 'FN', 'IF', 'TF', 'FS' и 'FT' - это пять типов функций, которые SSMS (через SMO) создает при написании сценария IF EXISTS ... DROP FUNCTION code.
Орландо Коламаттео
37

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

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

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

Тим С
источник
Да, спасибо, я тоже знаю INFORMATION_SCHEMA, но, как давний пользователь, sys.xxxx по-прежнему проще - спасибо за напоминание!
marc_s
4
INFORMATION_SCHEMA было бы замечательно, но он не включает в себя полное тело более крупных процедур, что делает его менее чем бесполезным, если вы ищете в теле. Не то, что вы не знаете, доставит вам неприятности, а то, что вы знаете, это не так ...
jmoreno
3
Представления Information_Schema явно задокументированы как ненадежные для некоторых вещей. например, «Не используйте представления INFORMATION_SCHEMA для определения схемы объекта. Единственный надежный способ найти схему объекта - запросить представление каталога sys.objects.» из msdn.microsoft.com/en-us/library/ ms188757.aspx
Дэвид Эйсон 08
Мне нравится этот ответ, потому что INFORMATION_SCHEMAзапрос возвращает очень интересные результаты вроде IS_DETERMINISTIC(которые я хотел узнать).
Томаш Гандор
18

Это действительно в 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
*/
Орландо Коламаттео
источник
1
Ваше предложение редактирования должно быть комментарием, а не редактированием. "Агрегатная функция AF" явно взята из документации MS (проверьте ссылку), поэтому этот пост выглядит полностью правильным. Если вы не согласны: прокомментируйте . Не редактировать. Если люди неоднократно отклоняли вашу правку, это должно быть намеком на то, что вы , возможно, делаете что-то не так, а не другие люди.
Мартин Турной,
@Carpetsmoker «AF» не считается «функцией» с точки зрения метаданных объекта SQL Server, даже если это означает AGGREGATE_FUNCTION. Более очевидно, что Aggregate - это тип объекта, отличный от других пользовательских функций, если учесть, что вы создаете новый агрегат с помощью CREATE AGGREGATE вместо CREATE FUNCTION. Типы объектов 'FN', 'IF', 'TF', 'FS' и 'FT' - это пять типов функций, которые SSMS (через SMO) генерирует при написании кода IF EXISTS ... DROP FUNCTION. Вы должны принять мое изменение, чтобы отменить неправильное добавление AF в список типов функций SQL Server.
Орландо Коламаттео,
5

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

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

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

Ayresome
источник
1
Да, это то, что я в основном делал сам, чтобы создать представление "sys_functions" :-) Просто интересно, почему его нет в продукте из коробки ....
marc_s
4

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

select * from sys.objects where type_desc like '%fun%'
ЙониЛави
источник
Если почтовый индекс, XML или данных образцов, пожалуйста , выделите эти строки в текстовом редакторе и нажмите на кнопку «код образцы» ( { }) на панели инструментов редактора , чтобы красиво формат и синтаксис выделить его!
marc_s
Спасибо, но я стараюсь избегать "иметь все", sys.objectsнасколько это возможно.
marc_s
4

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

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
вишал кадам
источник
2

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

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


источник
2

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

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

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';
Питер Брэнд
источник
0

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

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

ИЛИ

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
Горан Б.
источник