更新 pmbAustin 的建议
pmbAustin,谢谢。我认为这会奏效。我创建了一个返回 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