SQL表变量 - 添加检查匹配行集是否存在的约束

时间:2014-08-01 22:18:19

标签: sql sql-server exists check-constraints table-variable

使用pmbAustin的建议进行更新

pmbAustin,谢谢。我认为这会奏效。我创建了一个函数“dbo.CK_WinteamSportExists”,返回0或1.但是我现在得到一个令人困惑的错误信息。当我测试我的解决方案时,我得到以下内容:

create table #check
(
SportID int
,WinTeamID int
,LoseTeamID int
,check 
(
(dbo.CK_WinteamSportExists (WinTeamID , SportID) = 1)
)
)  

错误讯息: Msg 4121,Level 16,State 1,Line 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

1 个答案:

答案 0 :(得分:0)

请改用#TempTable。 @TableVariables有许多限制,#TempTables没有这些限制,如果你的内容不仅仅有几行,那么它们的表现也不会很好。