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 Server 2008如何检查表中是不是存在列? [复制]