0

更新 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
4

1 回答 1

0

请改用#TempTable。@TableVariables 有很多 #TempTables 没有的限制,而且如果您要在其中包含多于几行,那么它们的性能也不会那么好。

于 2014-08-01T22:32:17.677 回答