2nd Edit : Исходный код для задействованной функции выглядит следующим образом:
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
Редактировать : пример таблицы является упрощением. Мне нужно, чтобы это работало как операция Scaler Function / CHECK CONSTRAINT. Реальное устройство не так просто.
Оригинальный вопрос : предположим, что следующая таблица с именем FileUri
FileUriId, FileId, FileTypeId
Мне нужно написать проверочное ограничение, чтобы FileId был уникальным для FileTypeId, равного 1. Вы можете вставить тот же FileId, сколько захотите, но только одну строку, где FileTypeId равен 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 дважды, вторая вставка разрешается.
Спасибо, ТАК!