SQL Server 2005のシステムカタログには、頻繁に使用する優れたsys.XXXビューがあります。
私がつまずくのは、なぜストアドプロシージャに関する情報を見るための「sys.procedures」ビューがあるのに、ストアドファンクションについて同じものを見るための「sys.functions」ビューがないのですか?
誰もストアドファンクションを使用していませんか?たとえば、計算列など!
Sys.functionsが欠落している特定の理由がありますか、それともsysカタログビューに入れるのに十分重要ではないと考えられた何かですか? SQL Server 2008で利用できますか??
乾杯、マーク
UDFは非常に便利で、常に使用しています。
SQL Server 2005(または私が知る限りSQL Server 2008)に同等のsys.functionsを含めないことに対するMicrosoftの理論的根拠はわかりませんが、独自に展開するのは簡単です。
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のWebサイトによると、「情報スキーマビューは、SQL Serverメタデータのシステムテーブルに依存しない内部ビューを提供します。情報スキーマビューにより、基礎となるシステムテーブルに大幅な変更が加えられても、アプリケーションは正常に動作します」つまり、SQLがアップグレードされると、基になるシステムテーブルが変更される可能性がありますが、ビューは同じままである必要があります。
これは、関数のDROPをスクリプト化するときにSSMSが生成するものごとに、2008 R2で有効です。
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%'
これを試して :
SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
ちなみに、type = 'FS'を含めたくありませんか?
name type type_desc
getNewsletterStats FS CLR_SCALAR_FUNCTION
それは、sys.objectsのアイテムが、外部DLLから派生したUDFに対応するものです
@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')
OR
SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')