関数 (データベース エンジン)
SQL Server 2005 には、特定の演算を実行するために使用できる組み込み関数が用意されています。
関数は次の場所で使用できます。
SELECT ステートメントを使用して値を返すクエリの選択リスト。
SELECT DB_NAME(); GO
クエリを修飾する行を制限する、SELECT ステートメントまたはデータ変更 (SELECT、INSERT、DELETE、または UPDATE) ステートメントの WHERE 句検索条件。
USE AdventureWorks; GO SELECT SalesOrderID, ProductID, OrderQty FROM Sales.SalesOrderDetail WHERE OrderQty = (SELECT MAX(OrderQty) FROM Sales.SalesOrderDetail); GO
実行時にビューをユーザーまたは環境に動的に準拠させる、ビューの検索条件 (WHERE 句)。
CREATE VIEW ShowMyEmploymentInfo AS SELECT FirstName, LastName FROM Person.Contact WHERE ContactID = SUSER_SID(); GO
式。
データが追加されたときに指定値の有無をチェックする CHECK 制約またはトリガ。
CREATE TABLE SalesContacts (SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL); GO
INSERT ステートメントで値が指定されなかった場合に値を提供する、DEFAULT 制約またはトリガ。
CREATE TABLE SalesContacts ( SalesRepID INT PRIMARY KEY CHECK (SalesRepID = SUSER_SID() ), ContactName VARCHAR(50) NULL, ContactPhone VARCHAR(13) NULL, WhenCreated DATETIME DEFAULT GETDATE(), Creator INT DEFAULT SUSER_SID() ); GO
関数に引数がない場合でも、関数にはかっこを付けます。この例外に、DEFAULT キーワードと共に使用されるニラディック関数があります。ニラディック関数は引数を受け取りません。DEFAULT キーワードの詳細については、「ALTER TABLE (Transact-SQL)」および「CREATE TABLE (Transact-SQL)」を参照してください。
データベース、コンピュータ、ログイン、またはデータベース ユーザーを指定するパラメータは省略可能な場合があります。これらのパラメータが指定されなかった場合は、現在のデータベース、ホスト コンピュータ、ログイン、またはデータベース ユーザーが既定として使用されます。
関数は入れ子にできます。
関数の分類
次の表に、SQL Server 関数の分類を示します。
関数の分類 | 説明 |
---|---|
複数の値を 1 つの値に結合する演算を実行します。集計関数としては COUNT、SUM、MIN、MAX などがあります。 |
|
構成設定についての情報を返すスカラ関数です。 |
|
暗号化、暗号化解除、デジタル署名、およびデジタル署名の検証がサポートされています。 |
|
カーソルの状態についての情報を返します。 |
|
日付と時刻の値を変更します。 |
|
三角演算、幾何演算、その他の数値演算を実行します。 |
|
データベースとデータベース オブジェクトの属性についての情報を返します。 |
|
パーティション内の行ごとに順位付け値を返す、決定的関数です。 |
|
Transact-SQL ステートメント内でテーブル参照の代わりに使用できる行セットを返します。 |
|
ユーザーとロールについての情報を返します。 |
|
char、varchar、nchar、nvarchar、binary、および varbinary の値を変更します。 |
|
システムレベルの各種のオプションとオブジェクトを操作または報告します。 |
|
SQL Server のパフォーマンスについての情報を返します。 |
|
text 値および image 値を変更します。 |
決定的関数と非決定的関数
SQL Server 2005 では、関数は、厳密に決定的、決定的、または非決定的に分類されます。
一連の特定の入力値に対して関数が常に同じ結果を返す場合、関数は厳密に決定的です。
ユーザー定義関数では、決定性に少数の固定概念が適用されます。一連の特定の入力値やデータベース状態に対して関数が常に同じ結果を返す場合、ユーザー定義関数は決定的です。関数が厳密に決定的でなく、その関数がデータ アクセスの場合、この意味では決定的になります。
非決定的関数は、一連の同じ入力値で繰り返し呼び出されたときに、さまざまな結果を返すことがあります。たとえば、関数 GETDATE() は非決定的です。SQL Server では、非決定性のさまざまなクラスに制限が課せられます。したがって、非決定的関数は、注意深く使用する必要があります。
組み込み関数の場合は、決定性と厳密な決定性は同じです。Transact-SQL ユーザー定義関数の場合は、システムによって定義が確認され、非決定的関数を定義できないようになっています。ただし、データ アクセス関数または非スキーマ バインド関数は、厳密に決定的ではないと見なされます。共通言語ランタイム (CLR) 関数の場合は、関数の決定性、データ アクセス、およびシステム データ アクセスのプロパティが関数の定義によって指定されますが、これらのプロパティはシステムでは確認されないので、常に、厳密に決定的ではないと見なされます。
関数の決定性が明確でない場合は、使用できる場所が制限されることがあります。インデックス付きビュー、インデックス付き計算列、保存される計算列、または Transact-SQL ユーザー定義関数の定義では、決定的関数のみを呼び出すことができます。
関数の厳密な決定性が明確でない場合は、貴重なパフォーマンスの最適化がブロックされることがあります。内部的に正確さを保つために手順を並べ替える特定のプランがスキップされます。また、ユーザー定義関数への呼び出しの数、順序、およびタイミングは、実装によって異なります。これらの呼び出しのセマンティックに依存しないでください。ランタイム定数の非決定的組み込みの RAND、および GETDATE ファミリの他に、呼び出しの数、順序、およびタイミングは選択したプランによって異なります。
ベスト プラクティスと推奨事項
可能な場合は、以下のガイドラインに従うことをお勧めします。
1. 選択可能な場合は、厳密に決定的な関数を記述します。特に、Transact-SQL 関数はスキーマ バインドにします。
2. 非決定的な関数の使用を選択リストの一番外側に検定します。
3. パフォーマンスが重要なクエリでは、非決定的関数を使用しないでください。
4. 呼び出しの数、順序、またはタイミングは実装によって異なるので、これらに依存しないでください。
詳細については、「決定的関数と非決定的関数」を参照してください。