2

2回目の編集:関連する関数のソースコードは次のとおりです。

ALTER FUNCTION [Fileserver].[fn_CheckSingleFileSource] ( @fileId INT )
RETURNS INT
AS 
    BEGIN
        -- Declare the return variable here
        DECLARE @sourceCount INT ;

        -- Add the T-SQL statements to compute the return value here
        SELECT  @sourceCount = COUNT(*)
        FROM    Fileserver.FileUri
        WHERE   FileId = @fileId
                AND FileUriTypeId = Fileserver.fn_Const_SourceFileUriTypeId() ;

        -- Return the result of the function
        RETURN @sourceCount ;

    END

編集:サンプルテーブルは単純化したものです。これがスケーラー関数/CHECKCONSTRAINT操作として機能するために必要です。実際の配置はそれほど単純ではありません。

元の質問:FileUriという名前の次のテーブルを想定します

FileUriId、FileId、FileTypeId

FileTypeIdが1の場合にFileIdが一意になるように、チェック制約を記述する必要があります。同じFileIdを必要なだけ挿入できますが、FileTypeIdが1の場合は1行のみです。

うまくいかなかったアプローチ:

1)dbo.fn_CheckFileTypeIdは、次のロジックでINTを返します。 SELECT Count(FileId) FROM FileUri WHERE FileTypeId = 1

2)ALTER TABLE FileUri ADD CONSTRAINT CK_FileUri_FileTypeId CHECK dbo.fn_CheckFileTypeId(FileId) <= 1

FileId 1、FileTypeId 1を2回挿入すると、2回目の挿入が許可されます。

ありがとうSO!

4

2 に答える 2

4

フィルター処理された一意のインデックスを作成する必要があります(SQL Server 2008)

CREATE UNIQUE NONCLUSTERED  INDEX ix ON YourTable(FileId) WHERE FileTypeId=1

または、インデックス付きビューでこれをシミュレートします(2000および2005)

CREATE VIEW dbo.UniqueConstraintView
WITH SCHEMABINDING
AS
SELECT FileId
FROM dbo.YourTable
WHERE FileTypeId = 1

GO 
CREATE UNIQUE CLUSTERED  INDEX ix ON dbo.UniqueConstraintView(FileId)
于 2011-08-26T21:31:51.610 に答える
1

FieldTypeIDとFieldの両方をテーブルの主キーにしてみませんか?

または、少なくともテーブル上の一意のインデックス。それはあなたの問題を解決するはずです。

于 2011-08-26T21:27:58.447 に答える