【发布时间】:2011-07-07 15:10:05
【问题描述】:
我在表上使用检查约束来限制在表中插入的值..
这是我想要做的事情的解释
如果任何产品(轿车)与特定的 ObjLevel(丰田)相关联,则同一产品不能与另一个特定的 ObjLevel(雷克萨斯)相关联
在我对表应用检查约束后,任何包含 ObjLevel "toyota" 或 "lexus" 的插入都会失败..
create table ObjLevel(
OLID int identity,
Name varchar(50) not null
)
insert into ObjLevel values('Ford')
insert into ObjLevel values('Toyota')
insert into ObjLevel values('Lexus')
insert into ObjLevel values('GM')
insert into ObjLevel values('Infiniti')
create table ObjInstance(
OLIID int identity (20,1),
OLID int
)
insert into ObjInstance values(1)
insert into ObjInstance values(2)
insert into ObjInstance values(3)
insert into ObjInstance values(4)
insert into ObjInstance values(5)
create table Product(
PID int identity(50,1),
Name varchar(20)
)
insert into Product values ('sedan')
insert into Product values ('coupe')
insert into Product values ('hatchback')
create table ObjInstanceProd(
OLIID int,
PID int
)
create FUNCTION [dbo].[fnObjProd] (@Pid int) RETURNS bit WITH EXECUTE AS CALLER AS
BEGIN
DECLARE @rv bit
DECLARE @cnt int
SET @cnt = 0
SET @rv = 0
SET @cnt=
(Select Count(*) from ObjInstanceProd olip
join ObjInstance oli
on olip.OLIID = oli.OLIID
join ObjLevel ol
on ol.OLID = oli.OLID
where ol.Name in ('Toyota','Lexus')
and PID = @Pid)
if(@cnt>0)
SET @rv = 1
RETURN @rv
END
ALTER TABLE [dbo].[ObjInstanceProd] WITH CHECK ADD CONSTRAINT [CK_OLIP] CHECK ([dbo].[fnObjProd]([PID])=0)
--Insert Statement
insert into ObjInstanceProd(OLIID,PID) values (22,51)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK_OLIP". The conflict occurred in database "tmp", table "dbo.ObjInstanceProd", column 'PID'.
The statement has been terminated.
--Execute Function
select [dbo].[fnObjProd] (51)
0
最初表 ObjInstanceProd 是空的。所以,无论我在表中放入什么值,只要约束中的函数返回 0,它就应该接受它。但它没有。 该函数正确返回 0(独立执行时),但由于某种原因,检查约束返回 1
【问题讨论】:
标签: sql-server function join constraints