1

私は3つのテーブル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

このようなスカラー値関数は、この例で機能します。簡単に変更して、2 番目の制約を作成できます。

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

チェック制約内にクエリを記述することはできません。代わりに、ユーザー定義関数を呼び出すことができます。

@UOMGroupIdUNITOFMEASURID とともに値を渡すことにより、両方の制約で同じ関数を使用できます。

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 に答える