检查使用自定义函数的约束
Check Constraint Which Uses A Custom Function
我想让用户输入,只有一个数据输入ReqNo
,Type
等于'SS'。有两个问题:
- 我收到以下错误:
Msg 4145, Level 15, State 1, Line 21 An expression of non-boolean type
specified in a context where a condition is expected, near ')'.
- 尽管我自己不会通过我的应用程序进行更新,但该代码也应该规范化以进行更新,但也许未来操作我的应用程序数据的数据库管理员会在某个时候做一些事情。
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),我不太确定你的意思。
我想让用户输入,只有一个数据输入ReqNo
,Type
等于'SS'。有两个问题:
- 我收到以下错误:
Msg 4145, Level 15, State 1, Line 21 An expression of non-boolean type specified in a context where a condition is expected, near ')'.
- 尽管我自己不会通过我的应用程序进行更新,但该代码也应该规范化以进行更新,但也许未来操作我的应用程序数据的数据库管理员会在某个时候做一些事情。
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),我不太确定你的意思。