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

Posted

技术标签:

【中文标题】SQL 表变量 - 添加检查匹配行集是不是存在的约束【英文标题】:SQL Table Variables - adding constraint that checks for existence of matching row setSQL 表变量 - 添加检查匹配行集是否存在的约束 【发布时间】:2014-08-01 22:18:18 【问题描述】:

根据 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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于SQL 表变量 - 添加检查匹配行集是不是存在的约束的主要内容,如果未能解决你的问题,请参考以下文章

打开“Sheet1$”的行集失败。检查对象是不是存在于数据库中

检查表是不是存在后,将架构添加到 SQL 中的缺失表

因为该组节的条件字段不存在或无效所以无法打印

Sql Server 2008如何检查表中是不是存在列? [复制]

如何在合并数据集之前检查行是不是存在(SQL Server)

SQL - 如何返回某些行与给定列表匹配的整个行集