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