2015-05-14 219 views
1

我想在SQL Server中創建一個檢查約束。SQL Server:檢查約束

我有一張名爲Studies的表,它有'pnr','courseCode','assignment'。
我有一個名爲Student的表,它有'pnr'。
我有一張名爲Course的表,它有'courseCode'。
我有一個名爲Assignment的表,它有'courseCode','assignment','assignmentPoints'。

現在我想檢查一下,防止管理員將pnr插入Studies如果該pnr目前已經參加值得多點的課程,則限制爲45分。

我已經得到這麼多,但它不起作用。

create function EnrollmentFunction (@pnr varchar(10)) returns varchar(10) 
as 
begin 
    if exists (
      select sum(assignmentPoints) as Points 
      from Assignment a 
       join Studies s 
       on a.courseCode = s.courseCode 
        and a.assignmentName = s.assignmentName 
        and a.sectionName = s.sectionName 
        and pnr = @pnr 
      where assignmentPoints > 45) 
     return 'False' 
    return 'True' 
end 

alter table Studies 
with check add constraint CK_Points 
check (dbo.EnrollmentFunction(pnr) = 'True') 

然而,當我運行對特定學生插入和添加課程時學生已超過它通過對點的極限,檢查沒有阻止插件。

請幫忙!

+0

您是否需要pnr的總分配點數大於45或任何一個課程分配點和任務大於45? – ughai

+0

你的函數忽略了它的參數。這可能是第一個要解決的問題。 –

+0

學生已經參加的積分不得超過45分。 –

回答

2

不知道你的功能,但語法應該是這個樣子的邏輯.....

create function EnrollmentFunction 
(@pnr varchar(10)) 
returns varchar(10) 
as 
begin 
    DECLARE @RtnValue varchar(10); 

    if exists (select 1 
       from Assignment a 
       join Studies s on a.courseCode = s.courseCode 
           and a.assignmentName = s.assignmentName 
           and a.sectionName = s.sectionName 
           and pnr = @pnr 
       where assignmentPoints > 45 
       ) 
     BEGIN 
      SET @RtnValue = 'False' 
     END 
    ELSE 
     BEGIN 
     SET @RtnValue = 'True' 
     END 

    RETURN @RtnValue;  
end 
+0

如果OP要求總分配點數大於45,那麼可以使用'sum(assignmentPoints)> 45'來代替'where assignmentpointss> 45' – ughai

+0

這不考慮學生已經採取的積分總和。我試着使用你的語法與我使用的總和查詢,但它沒有工作,但=( –

0
create function EnrollmentFunction 
(@pnr varchar(10)) 
returns varchar(10) 
as 
begin 
    DECLARE @RtnValue varchar(10); 

    if exists (select sum(assignmentPoints) as Points from Assignment a join Studies s 
on a.courseCode = s.courseCode and a.assignmentName = s.assignmentName and a.sectionName = s.sectionName and pnr = @pnr 
where assignmentPoints > 45 
       ) 
     BEGIN 
      SET @RtnValue = 'True' 
     END 
    ELSE 
     BEGIN 
     SET @RtnValue = 'False' 
     END 

    RETURN @RtnValue;  
end 

這不起作用。它會返回「假」如果學生正在課程價值45分,如果不符合則返回'假'。所以要麼結果是小於45,比如說35。或者它會說空。無論哪種方式,結果都是'假'。