使用用户定义函数作为临时表中的约束

Posted

技术标签:

【中文标题】使用用户定义函数作为临时表中的约束【英文标题】:Using a User Defined Function as a constraint within a temporary table 【发布时间】:2014-08-02 22:04:34 【问题描述】:

我正在尝试创建一个在约束中使用 UDF 的临时表。我收到以下错误消息:

消息 4121,第 16 级,状态 1,第 1 行 找不到列dbo 或用户定义的函数或聚合dbo.CK_LoseTeamSportExists,或者名称不明确。

我已经测试了这个功能,它可以在其他环境中工作。任何的想法?

所有代码如下:

CREATE FUNCTION dbo.CK_LoseTeamSportExists
(
    @loseteam     INT,
    @sportid      INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @return BIT  
    IF EXISTS 
       (
           SELECT    TeamID,
                 sportid
           FROM  Link_TeamSport
           WHERE     (TeamID = @loseteam AND SportID = @sportid)
       )
        SET @return = 1
    ELSE
        SET @return = 0

    RETURN @return
END
GO

CREATE TABLE #check
(
    SportID        INT,
    WinTeamID      INT,
    LoseTeamID     INT,
    CHECK          ((dbo.CK_LoseTeamSportExists(LoseTeamID, SportID) = 1))
)

【问题讨论】:

【参考方案1】:

这应该可行。

USE [tempdb]
GO
CREATE FUNCTION dbo.CK_LoseTeamSportExists
(
    @loseteam     INT,
    @sportid      INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @return BIT  
    IF EXISTS 
       (
           SELECT    TeamID,
                 sportid
           FROM  Link_TeamSport
           WHERE     (TeamID = @loseteam AND SportID = @sportid)
       )
        SET @return = 1
    ELSE
        SET @return = 0

    RETURN @return
END
GO

IF OBJECT_ID(N'tempdb..#check')>0
DROP TABLE #check
GO

CREATE TABLE #check
(
    SportID        INT,
    WinTeamID      INT,
    LoseTeamID     INT,
    CHECK          ((dbo.CK_LoseTeamSportExists(LoseTeamID, SportID) = 1))
)

【讨论】:

注意:无需对 SQL Server 2014 中的原始脚本进行任何修改即可工作

以上是关于使用用户定义函数作为临时表中的约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebird 2.1 中临时禁用表中的所有约束?

如何复制临时表中列的默认约束?

将表作为参数传递给函数

sql如何创建临时表

让函数返回表的更新部分

使用用户定义的函数动态更新临时表和数据库表条目