SQL Server-где находится " sys.функции"?
SQL Server 2005 имеет отличный sys.XXX просмотры системного каталога, который я часто использую.
что меня спотыкается: почему есть " sys.процедуры "просмотр для просмотра информации о ваших хранимых процедурах, но нет" sys.функции " просмотр, чтобы увидеть то же самое для ваших сохраненных функций?
никто не использует хранимые функции? Я нахожу их очень удобными, например, для вычисляемых столбцов и тому подобного!
есть ли конкретная причина sys.функции отсутствуют, или это просто что-то, что не считалось достаточно важным, чтобы поместить в представления каталога sys?? Доступен ли он в SQL Server 2008??
Ура, Марк!--1-->
10 ответов
Я считаю, что UDFs очень удобны, и я использую их все время.
Я не уверен, что обоснование Microsoft не включает sys.функции эквивалентны в 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
другой способ перечислить функции-использовать представления INFORMATION_SCHEMA.
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION'
в соответствии с веб-узлом Microsoft "представления информационной схемы предоставляют внутреннее, независимое от системной таблицы представление метаданных SQL Server. Представления информационных схем позволяют приложениям работать правильно, хотя в базовые системные таблицы были внесены значительные изменения". Другими словами, базовые системные таблицы могут изменяться по мере обновления SQL, но представления все равно должны остаться прежним.
это действительно в 2008 R2 на то, что SSMS генерирует при написании сценария капли функции:
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
*/
это очень немного более многословно, но это должно делать то же самое:
select * from sys.objects where (type='TF' or type='FN')
насколько я вижу,это также не в SQL Server 2008.
Это не добавляет ничего нового, но я нашел следующие легче запомнить:
select * from sys.objects where type_desc like '%fun%'
кстати, не хотите ли вы включить type = 'FS'?
name type type_desc
getNewsletterStats FS CLR_SCALAR_FUNCTION
это то, что элемент в sys.объекты соответствуют для моего UDF, который является производным от внешней DLL
чтобы расширить ответ @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
где выше отображается имя функции, ее определение и идентификатор объекта соответственно.
для более полного описания скалярных функций, включая владельца и тип возврата:
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';
SQL 2000
специфическая, небольшая регулировка для имени объекта:
SELECT *
FROM sysobjects
WHERE type IN ('FN', 'IF', 'TF')
или
SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')