web-dev-qa-db-ja.com

SQL Server-「sys.functions」はどこにありますか?

SQL Server 2005のシステムカタログには、頻繁に使用する優れたsys.XXXビューがあります。

私がつまずくのは、なぜストアドプロシージャに関する情報を見るための「sys.procedures」ビューがあるのに、ストアドファンクションについて同じものを見るための「sys.functions」ビューがないのですか?

誰もストアドファンクションを使用していませんか?たとえば、計算列など!

Sys.functionsが欠落している特定の理由がありますか、それともsysカタログビューに入れるのに十分重要ではないと考えられた何かですか? SQL Server 2008で利用できますか??

乾杯、マーク

97
marc_s

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
108
LukeH

関数をリストする別の方法は、INFORMATION_SCHEMAビューを利用することです。

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

MicrosoftのWebサイトによると、「情報スキーマビューは、SQL Serverメタデータのシステムテーブルに依存しない内部ビューを提供します。情報スキーマビューにより、基礎となるシステムテーブルに大幅な変更が加えられても、アプリケーションは正常に動作します」つまり、SQLがアップグレードされると、基になるシステムテーブルが変更される可能性がありますが、ビューは同じままである必要があります。

37
Tim C

これは、関数の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
*/
17

非常に少し冗長ですが、これはまったく同じことを行う必要があります。

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

私の知る限り、SQL Server 2008にもありません。

5
Ayresome

これは新しいものを追加しませんが、次のことは覚えやすいと思います。

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

これを試して :

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
4
vishal kadam

ちなみに、type = 'FS'を含めたくありませんか?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

それは、sys.objectsのアイテムが、外部DLLから派生したUDFに対応するものです

2
kramaswamy

@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
MoonKnight

所有者と戻り値の型を含むスカラー関数の詳細な説明:

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';
2
Peter Brand

SQL 2000特定、オブジェクト名の微調整:

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

OR

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
0
Goran B.