40

私は2008R2で設計されたテーブルを持っていますSQL-Server

そのテーブルに列があり、データを挿入するときに別のテーブルと照合する必要があります。

ALTER TABLE Table1
        WITH CHECK ADD CONSTRAINT CK_Code
        CHECK (MyField in (Select Field From Table2))

これによりエラーが発生します

このコンテキストでは、サブクエリは許可されていません。スカラー式のみが許可されます。

チェック制約に関するこの質問を見てきました-このコンテキストではサブクエリは許可されていません

トリガーを使用せずにこれを達成する方法はありますか?

4

4 に答える 4

63

本当に必要なのは外部キー制約であることに注意してください。とはいえ、「クエリ」をチェックに入れるには、クエリを含み、スカラー値を出力する関数を記述してから、その関数をチェック制約で使用します。

CREATE FUNCTION myFunction (
    @field DATATYPE(?)
)
RETURNS VARCHAR(5)
AS
BEGIN
    IF EXISTS (SELECT* FROM Table2 WHERE MYFIELD = @field)
        return 'True'
    return 'False'
END

そんな感じ。未検証。

次に、そのようにチェックに追加できます

ALTER TABLE Table1
    WITH CHECK ADD CONSTRAINT CK_Code
    CHECK (myFunction(MYFIELD) = 'True')
于 2012-10-21T18:17:19.010 に答える
9

チェック制約内にサブクエリを含めることはできません。できることは、チェック制約内でスカラー値を返すUDFを使用することです。

ステップ1:テーブルを作成する

USE CTBX
GO

CREATE TABLE RawMaterialByGender 
(
RMGID int primary key identity(1,1),
RMID smallint foreign key references RawMaterialMaster(RMID),
LeveLMasterID smallint foreign key references LevelMaster(LevelTextID),
IsDeleted bit
)

ステップ2:スカラーを返すUDFを作成する

Create FUNCTION [dbo].[IsValidLevelMasterGender](@LevelMasterID smallint)

    RETURNS bit
    AS
    BEGIN
     DECLARE @count smallint;
     DECLARE @return bit;

     SELECT @count = count(LevelTextID)      
     FROM [LevelMaster]
     WHERE LevelCategoryID = 3 AND IsActive = 1 AND LevelTextID=@LevelMasterID

     IF(@count = 0)
     SET @return = 'false';
     ELSE
     SET @return = 'true';

     RETURN @return;

    END;
    GO

ステップ3:テーブルを変更してCHECK制約を追加する

ALTER TABLE RawMaterialByGender 
ADD CONSTRAINT check_LevelMasterID CHECK (dbo.IsValidLevelMasterGender(LeveLMasterID) = 'true')
于 2015-12-01T09:26:59.063 に答える
3
ALTER TABLE Table1
ADD CONSTRAINT FK_Table1_Code FOREIGN KEY (MyField)
REFERENCES Table2 (Field) ;

参照:http://msdn.microsoft.com/en-us/library/ms190273.aspx
注:上記の構文はチェックしていません。

于 2012-10-21T18:25:49.170 に答える
1

まず第一に、あなたの例では明らかにFK制約が必要です。

もう1つの可能性は、ビューを使用して、ビューをWITH CHECK OPTION介してユーザーにアクセスを許可することです。

CREATE TABLE Table1(i INT PRIMARY KEY, CK_Code CHAR(1));
CREATE TABLE Table2(Field CHAR(1));
INSERT INTO Table2(Field) VALUES ('A'),('B'), ('C');
GO

CREATE VIEW v_Table1
AS
SELECT *
FROM Table1
WHERE CK_code IN (SELECT Field FROM Table2)  -- here goes your subquery check
WITH CHECK OPTION;

次のような「制約」に違反するデータを挿入しようとすると、次のようになります。

INSERT INTO v_Table1(i, CK_Code)
VALUES(10, 'D');

あなたが得るでしょう:

ターゲット・ビューがWITH CHECK OPTIONを指定しているか、WITH CHECK OPTIONを指定するビューにまたがっており、操作の結果の1つ以上の行がCHECK OPTION制約に適合しなかったため、挿入または更新の試行は失敗しました。

ステートメントは終了されました。

LiveDemo

于 2017-02-07T19:52:16.957 に答える