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


104

SQL Server 2005のシステムカタログには、頻繁に使用するsys.XXXビューが用意されています。

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

誰もがストアド関数を使用していませんか?計算列などに非常に便利です。

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

乾杯、マルク


TimCが提供する回答(1月22日14:06に回答)は、sys.tablesに存在するmodify_date列と同様のINFORMATION_SCHEMA.ROUTINESにLAST_ALTERED列があるため、古いsysobjectsシステムテーブルを使用するよりも優先されます。 sys.views、sys.proceduresなど。ただし、より更新されたsys.objectsシステムビューを使用している場合は、これらのテーブルのようにmodify_dateがあります。私の0.02ドル。乾杯
Maashu 2009

1
@JuniorMayhe:わかりました-ここに私が入力したConnect提案フィードバックがあります -賛成投票してください!:-)
marc_s 2015

1
@marc_sには良い点があると思います。多くの人々は、がない理由を理解できませんsys.functions。あなたは持っsys.foreign_keysていsys.primary_keysます。とにかく、connect.microsoft.com / SQLServer / FeedbackでSQL Serverの次期バージョンの新機能を提案および提案するためにMicrosoftのオープンチャネルを使用することを皆さんにお願いします。sys.functions
JuniorMayhé

回答:


117

UDFは非常に便利で、いつも使用しています。

Microsoftの理論的根拠がSQL Server 2005(またはSQL Server 2008、私が知る限り)に相当するsys.functionsを含めない理由はわかりませんが、独自の方法で簡単にロールできます。

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」列の説明をこちらで参照してください
Triynko '21

4
"AF"は、SQL ServerのオブジェクトメタデータではAGGREGATE_FUNCTIONを表していますが、 "関数"とは見なされません。CREATE FUNCTIONの代わりにCREATE AGGREGATEを使用して新しい集計を作成すると考えると、Aggregateが他のユーザー定義関数とは異なるオブジェクトタイプであることはより明確です。オブジェクトタイプ「FN」、「IF」、「TF」、「FS」、「FT」は、IF EXISTS ... DROP FUNCTIONコードをスクリプト化するときにSSMSが(SMOを介して)生成する5つの関数タイプです。
Orlando Colamatteo

37

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

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

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


はい、ありがとうございます。INFORMATION_SCHEMAも知っています。ただし、長い間、sys.xxxxは簡単に使用できます。リマインダーに感謝します。
marc_s 2009年

4
INFORMATION_SCHEMAはすばらしいですが、より大きなプロシージャの完全なボディは含まれていません。そのため、ボディで検索している場合、それは価値がありません。困るのはあなたが知らないことではありませんが、そうでないことを知っているのは...
jmoreno

3
Information_Schemaビューは、いくつかの点で信頼性がないと明確に文書化されています。たとえば、「INFORMATION_SCHEMAビューを使用してオブジェクトのスキーマを決定しないでください。オブジェクトのスキーマを見つける唯一の信頼できる方法は、sys.objectsカタログビューにクエリを実行することです。」from msdn.microsoft.com/en-us/library/ ms188757.aspx
David Eison

INFORMATION_SCHEMAクエリがIS_DETERMINISTIC(私が知りたかった)のような非常に興味深い結果を返すので、私はこの答えが好きです。
Tomasz Gandor 2015年

18

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

1
編集の提案は、編集ではなくコメントにする必要があります。"AF Aggregate function"は明らかにMSのドキュメント(リンクを確認)にあるため、この投稿は完全に正しいように見えます。同意しない場合:コメント。編集しないでください。他の人があなたの編集を繰り返し拒否した場合、これはおそらくあなたが何か間違ったことをしていて、他の人ではないというヒントになるはずです
Martin Tournoij 2016年

@Carpetsmoker "AF"は、SQL ServerのオブジェクトメタデータではAGGREGATE_FUNCTIONを表していますが、 "関数"とは見なされません。CREATE FUNCTIONの代わりにCREATE AGGREGATEを使用して新しい集計を作成すると考えると、Aggregateが他のユーザー定義関数とは異なるオブジェクトタイプであることはより明確です。オブジェクトタイプ「FN」、「IF」、「TF」、「FS」、「FT」は、IF EXISTS ... DROP FUNCTIONコードをスクリプト化するときにSSMSが(SMOを介して)生成する5つの関数タイプです。私の編集を受け入れて、SQL Server関数タイプのリストへのAFの誤った追加を元に戻す必要があります。
Orlando Colamatteo 2016年

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 '23年

おかげで、私sys.objectsはできるだけ多くのことを回避しようとします。
marc_s '23年


2

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

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

これは、sys.objectsの項目が、外部DLLから派生した私のUDFに対応するものです


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')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.