0

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
4

1 に答える 1

0

代わりに #TempTable を使用してください。@TableVariables には、#TempTables にはない多くの制限があり、数行以上の行が含まれる場合も同様に機能しません。

于 2014-08-01T22:32:17.677 に答える