SQL Serverの計算列の広く知られている制限は、他のテーブルのデータにアクセスできないことです。つまり、式は同じテーブルの列を使用できますが、他のテーブルの列は使用できません。
しかし、これは半分しか真実ではありません。式内で別のテーブルの列を直接参照することはできませんが、できます。 ユーザー定義関数を呼び出します。したがって、必要な計算を実行するユーザー定義関数を作成し、その関数を計算列の式として呼び出すだけで済みます。
実例を示します。
サンプルテーブル
次のテーブルを含むデータベースがあります:
SELECT TOP(5) * FROM Artists; +------------+------------------+--------------+-------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | |------------+------------------+--------------+-------------| | 1 | Iron Maiden | 1975-12-25 | 3 | | 2 | AC/DC | 1973-01-11 | 2 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | | 4 | Buddy Rich | 1919-01-01 | 6 | | 5 | Devin Townsend | 1993-01-01 | 8 | +------------+------------------+--------------+-------------+ SELECT TOP(5) * FROM Albums; +-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
これらのテーブルには、実際には5行以上が含まれています。データとテーブル構造の全体像を把握できるように、上位5行を選択しました。
ここで、計算列を最初のテーブルに追加したいとします。
計算された列に、各アーティストのアルバムの数を指定したいと思います。つまり、他のテーブル(Albums
)のアルバムをカウントするために必要です。 テーブル。
データが別のテーブルにあるため、計算列内から直接参照することはできません。ただし、代わりにユーザー定義関数を作成して、計算列内からその関数を参照することもできます。
関数を作成する
特定のアーティストのアルバムの数をカウントする簡単な関数は次のとおりです。
CREATE FUNCTION [dbo].[ufn_AlbumCount] (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END; GO
計算列を作成する
関数を作成したので、それを参照する計算列を追加できます。
ALTER TABLE Artists ADD AlbumCount AS dbo.ufn_AlbumCount(ArtistId);
計算列のテスト
これで、Artists
に対してクエリを実行できます。 計算された列の結果を確認するための表:
SELECT TOP(10) * FROM Artists;
結果:
+------------+------------------+--------------+-------------+--------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | AlbumCount | |------------+------------------+--------------+-------------+--------------| | 1 | Iron Maiden | 1975-12-25 | 3 | 5 | | 2 | AC/DC | 1973-01-11 | 2 | 3 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | 2 | | 4 | Buddy Rich | 1919-01-01 | 6 | 1 | | 5 | Devin Townsend | 1993-01-01 | 8 | 3 | | 6 | Jim Reeves | 1948-01-01 | 6 | 1 | | 7 | Tom Jones | 1963-01-01 | 4 | 3 | | 8 | Maroon 5 | 1994-01-01 | 6 | 0 | | 9 | The Script | 2001-01-01 | 5 | 1 | | 10 | Lit | 1988-06-26 | 6 | 0 | +------------+------------------+--------------+-------------+--------------+
インデックス作成
インデックスで計算列を使用できるのは、それが呼び出すユーザー定義関数に次のプロパティ値がある場合のみです。
- IsDeterministic =true
- IsSystemVerified =true(計算列が永続化されていない場合)
- UserDataAccess =false
- SystemDataAccess =false