检查使用自定义函数的约束

Check Constraint Which Uses A Custom Function

我想让用户输入,只有一个数据输入ReqNoType等于'SS'。有两个问题:

  1. 我收到以下错误:

Msg 4145, Level 15, State 1, Line 21 An expression of non-boolean type specified in a context where a condition is expected, near ')'.

  1. 尽管我自己不会通过我的应用程序进行更新,但该代码也应该规范化以进行更新,但也许未来操作我的应用程序数据的数据库管理员会在某个时候做一些事情。

List ENDS(我添加这一行是为了让解析器开始解析代码,否则它不会)

CREATE FUNCTION dbo.ReqNoIsUniquePerReserve
(
    @ReqNo AS BIGINT,
    @Type AS CHAR
)
RETURNS BIT
AS
BEGIN
    IF UPPER(@Type) = 'SS'
    BEGIN
        IF EXISTS (SELECT TOP 1 Id FROM dbo.LiaQueue WHERE @ReqNo = ReqNo)
            RETURN 0; 
        ELSE
            RETURN 1;
    END
    ELSE IF @ReqNo IS NOT NULL
    BEGIN
        IF EXISTS (SELECT TOP 1 ID FROM dbo.LiaQueue WHERE @ReqNo = ReqNo)
            RETURN 1;
        ELSE
            RETURN 0;
    END
    RETURN 1;
END

ALTER TABLE dbo.LiaQueue 
ADD CONSTRAINT CK_LiaQueue_ReqNo_Unique 
CHECK (dbo.[ReqNoIsUniquePerReserve](ReqNo,[Type]))

更新

USE [Liaison]
GO
/****** Object:  UserDefinedFunction [dbo].[ReqNoIsUniquePerReserve]    Script Date: 10/03/2016 12:48:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[ReqNoIsUniquePerReserve]
(
    @Id AS BIGINT,
    @Command AS NVARCHAR,
    @ReqNo AS BIGINT
)
RETURNS BIT
AS
BEGIN
    IF UPPER(@Command) = 'SS'
    BEGIN
        IF EXISTS (SELECT TOP 1 Id FROM dbo.LiaQueue WHERE @ReqNo = ReqNo AND Id <> @Id)
            RETURN 0; 
        ELSE
            RETURN 1;
    END
    ELSE IF @ReqNo IS NOT NULL
    BEGIN
        IF EXISTS (SELECT TOP 1 ID FROM dbo.LiaQueue WHERE @ReqNo = ReqNo)
            RETURN 1;
        ELSE
            RETURN 0;
    END
    RETURN 1;
END



ALTER TABLE dbo.LiaQueue 
ADD CONSTRAINT CK_LiaQueue_ReqNo_Unique 
CHECK (dbo.[ReqNoIsUniquePerReserve](Id, Command, ReqNo) = 1)

对于 1)

你试过了吗:

ALTER TABLE dbo.LiaQueue 
ADD CONSTRAINT CK_LiaQueue_ReqNo_Unique 
CHECK (dbo.[ReqNoIsUniquePerReserve](ReqNo,[Type]) = 1)

对于 2),我不太确定你的意思。