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!