119

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

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

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

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

4

10 に答える 10

127

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
于 2009-01-22T11:35:51.397 に答える
38

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

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

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

于 2009-01-22T14:06:47.287 に答える
19

This is valid in 2008 R2 per what SSMS generates when you script a DROP of a function:

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
*/
于 2011-03-01T18:37:38.563 に答える
5

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

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

私が見る限り、SQL Server 2008 にもありません。

于 2009-01-22T11:35:41.087 に答える
4

これは新しいものを追加するものではありませんが、覚えやすいのは次のとおりです。

select * from sys.objects where type_desc like '%fun%'
于 2011-05-23T11:16:18.070 に答える
4

これを試して :

SELECT * FROM sys.objects
where type_desc = 'SQL_SCALAR_FUNCTION'
于 2014-01-27T10:02:11.050 に答える
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

ここで、上記はそれぞれ関数名、その定義、およびオブジェクト識別子を表示します。

于 2012-03-08T15:01:06.083 に答える
2

ちなみに、type = 'FS' を含めたくないですか?

name    type    type_desc
getNewsletterStats  FS  CLR_SCALAR_FUNCTION

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

于 2009-07-07T11:26:15.823 に答える
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';
于 2014-03-27T18:14:52.293 に答える
0

SQL 2000オブジェクト名の特定のわずかな調整:

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

また

SELECT *
FROM dbo.sysobjects
WHERE type IN ('FN', 'IF', 'TF')
于 2015-06-03T00:06:08.567 に答える