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

编辑:示例表是一个简化。我需要它作为 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 两次时,允许第二次插入。

谢谢!

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 回答