1

我有三个表 a、b 和 c,需要添加如下约束来检查数据完整性

以下是错误的,但我需要帮助来执行以下条件。

ALTER TABLE [a]
ADD CONSTRAINT  UOMGROUPIG CHECK UNITOFMEASURID IN (SELECT UnitOfMeasureId FROM b  WHERE UOMGroupId=1 )

ALTER TABLE [c]
ADD CONSTRAINT  UOMGROUPIG CHECK UNITOFMEASURID IN (SELECT UnitOfMeasureId FROM b  WHERE UOMGroupId=2 )

谢谢

4

2 回答 2

1

像这样的标量值函数适用于您的示例,您可以轻松修改它并创建第二个约束:

CREATE FUNCTION your_schema_name.udf_Check1(
    @UNITOFMEASURID INT
)
RETURNS BIT
AS 
BEGIN

    DECLARE @returnValue BIT = 0

    SELECT  @returnValue = CASE WHEN COUNT(UnitOfMeasureId) > 0 THEN 1 ELSE 0 END
    FROM    your_schema_name.b 
    WHERE   UOMGroupId=1
    AND     @UNITOFMEASURID = UnitOfMeasureId

    RETURN @returnValue

END
GO

ALTER TABLE [a] 
ADD CONSTRAINT UOMGROUPIG 
CHECK (your_schema_name.udf_Check1(UNITOFMEASURID) = 1)
GO  

这是示例:SQL Fiddle

于 2012-11-28T09:28:34.070 回答
1

您不能在 Check 约束内编写查询。相反,您可以调用用户定义的函数。

@UOMGroupId通过将值与 UNITOFMEASURID 一起传递,您可以在两个约束中使用相同的函数。

CREATE FUNCTION CheckFnctn(@UNITOFMEASURID int, @UOMGroupId int)
RETURNS int
AS 
BEGIN
    if exists(SELECT UnitOfMeasureId FROM b  WHERE UOMGroupId=@UOMGroupId 
    and UnitOfMeasureId = @UNITOFMEASURID)
    BEGIN
        RETURN 1;
    END

     RETURN 0; --missed this line
END;


ALTER TABLE [a]
ADD CONSTRAINT  UOMGROUPIG CHECK (dbo.CheckFnctn(UNITOFMEASURID, 1)=1);
ALTER TABLE [c]
ADD CONSTRAINT  UOMGROUPIG CHECK (dbo.CheckFnctn(UNITOFMEASURID, 2)=1);
于 2012-11-28T09:28:40.543 回答