pmbAustin の提案による更新
pmbオースティン、ありがとう。それはうまくいくと思います。0 または 1 を返す関数「dbo.CK_WinteamSportExists」を作成しました。ただし、不可解なエラー メッセージが表示されます。ソリューションをテストしたところ、次の結果が得られました。
create table #check
(
SportID int
,WinTeamID int
,LoseTeamID int
,check
(
(dbo.CK_WinteamSportExists (WinTeamID , SportID) = 1)
)
)
エラー メッセージ: メッセージ 4121、レベル 16、状態 1、行 1 列 "dbo"、ユーザー定義関数または集計 "dbo.CK_WinteamSportExists" が見つからないか、名前があいまいです。
完全修飾名「mydatabase.dbo.CK_WinteamSportExists」を使用してみましたが、サイコロはありません。
チェックで構文が間違っているようですが、私の人生ではエラーを見つけることができません。
元の質問
テーブル変数に参照整合性を適用しようとしています。SQL Server 2012 で作業しています。
declare @GameID_Table table (
GameID int
,SportID int
,WinTeamID int
,LoseTeamID int
)
@GameID_Table の WinTeamID/SportID と LoseTeamID/SportID の組み合わせは、次のように定義された別のテーブル Link_TeamSport に一致する行が存在することによって制約される必要があります。
create table Link_TeamSport
(
TeamID int,
SportID int
primary key (TeamID, SportID)
)
通常、複合外部キーを使用してこれを行いますが、これらはテーブル変数では許可されていません。
また、Link_TeamSport で一致する行の存在をチェックするユーザー定義関数を作成しようとしましたが、UDF はテーブル変数でも許可されていません。
これは、私の制約条件を示す作業コードの例です。以下のコードは、一致する行が見つかった場合は 1 の結果を返し、そうでない場合は 0 を返します。ただし、この概念を @GameID_Table 内のチェック制約に組み込む方法がわかりません。
declare @winteam int
declare @sportid int
set @winteam = 1001
set @sportid = 4001
select count(*) from
(
select lts.TeamID, lts.sportid from Link_TeamSport lts
where
(@winteam = lts.TeamID and @sportid = lts.sportid)
) a