SQL Server - де "sys.functions"?


104

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

Що мене наштовхує на це: чому існує перегляд "sys.procedures", щоб побачити інформацію про ваші збережені процедури, але немає "sys.functions", щоб побачити те саме для збережених функцій?

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

Чи є певна причина відсутності функцій sys.functions, чи це просто щось, що не вважалося достатньо важливим, щоб помістити їх у каталог подання sys ?? Чи доступний він у SQL Server 2008 ??

Ура, Марк


Відповідь, надану 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: Гаразд - ось зворотний зв'язок із пропозицією підключення, який я ввів - перейдіть до цього! :-)
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 / відгуки / деталі / 1127920
Junior Mayhé

Відповіді:


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'. Дивіться опис стовпців sys.objects "type" тут: msdn.microsoft.com/en-us/library/ms190324.aspx
Трийнко

4
"AF" не вважається "функцією" з точки зору метаданих об'єктних даних SQL Server, навіть якщо це означає AGGREGATE_FUNCTION. Більш зрозуміло, що агрегат - це тип об'єкта, який відрізняється від інших визначених користувачем функцій, якщо врахувати, що ви створюєте новий агрегат за допомогою CREATE AGGREGATE замість CREATE FUNCTION. Типи об'єктів 'FN', 'IF', 'TF', 'FS' і 'FT' - це п’ять типів функцій для того, що створює SSMS (через SMO) під час написання сценарію, ЯКЩО ІСНУЄ ... ДРОПУВАННЯ ФУНКЦІЙНОГО коду.
Орландо Коламаттео

37

Іншим способом переліку функцій є використання INFORMATION_SCHEMA переглядів.

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

Згідно з веб-сайтом Майкрософт, "представлення інформаційних схем забезпечує внутрішнє, незалежне від системних таблиць перегляд метаданих SQL Server. Перегляди інформаційних схем дозволяють програмам працювати правильно, хоча в основні системні таблиці були внесені значні зміни". Іншими словами, основні таблиці Системи можуть змінюватися в міру оновлення SQL, але представлення все одно повинні залишатися тими ж.


Так, дякую, я теж знаю INFORMATION_SCHEMA - але, як давно користувач, sys.xxxx все ще стає простіше - дякую за нагадування!
marc_s

4
INFORMATION_SCHEMA було б чудово, але воно не включає повний обсяг більш великих процедур - що робить його менш ніж марним, якщо ви шукаєте в тілі. Це не те, чого ти не знаєш, що
зашкодить

3
Погляди Information_Schema прямо зафіксовані як такі, що не є надійними для деяких речей. наприклад, "Не використовуйте представлення INFORMATION_SCHEMA для визначення схеми об'єкта. Єдиний надійний спосіб знайти схему об'єкта - це запит подання каталогу sys.objects." від msdn.microsoft.com/en-us/library/ ms188757.aspx
Девід Ейсон

Мені подобається ця відповідь, тому що 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 Aggregate function" чітко видно з документації на MS (перевірте посилання), тому ця публікація виглядає цілком коректно. Якщо ви не згодні: коментуйте . Не редагувати. Якщо люди неодноразово відхиляли вашу редакцію, це має бути натяком на те, що ви , можливо, робите щось не так, а не інші люди.
Мартін Турноїй

@Carpetsmoker "AF" не вважається "функцією" з точки зору метаданих об'єктних даних SQL Server, навіть якщо це означає AGGREGATE_FUNCTION. Більш зрозуміло, що агрегат - це тип об'єкта, відмінний від інших визначених користувачем функцій, якщо врахувати, що ви створюєте новий агрегат за допомогою CREATE AGGREGATE замість CREATE FUNCTION. Типи об'єктів 'FN', 'IF', 'TF', 'FS' і 'FT' - це п’ять типів функцій для того, що створює SSMS (через SMO) під час написання сценарію, ЯКЩО ІСНУЄ ... ДРОПУВАННЯ ФУНКЦІЙНОГО коду. Ви повинні прийняти мою редакцію, щоб повернути неправильне додавання AF до списку функцій SQL Server.
Орландо Коламаттео

5

Це дуже дещо докладніше, але це має робити саме те саме:

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

Наскільки я бачу, його немає і в SQL Server 2008.


1
Так, це те, що я в основному робив сам, щоб створити перегляд "sys_functions" :-) Цікаво, чому це не в продукті з коробки ....
marc_s

4

Це не додає нічого нового, але мені було легше запам'ятати наступне:

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

Якщо ви розміщуєте код, XML або зразки даних, будь ласка, виділіть ці рядки в текстовому редакторі та натисніть кнопку "зразки коду" ( { }) на панелі інструментів редактора, щоб гарненько відформатувати та підкреслити синтаксис!
marc_s

Дякую, але я намагаюсь максимально уникати "мати все" sys.objects.
marc_s


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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.