declare @FJobID int declare @FJobIDs int if datediff(day,@FJDate,'2015-03-27')<=0 begin select @FJobID=FJobID from Hr_Job where FDepaID=@FNDepaID and FJobsID=@FNJobsID if (isnull(@FJobID,0)=0) begin insert into Hr_Job(FJobsID,FDepaID)values(@FNJobsID,@FNDepaID) set @FJobIDs=@@identity update Hr_Employee set FDepaID = @FNDepaID,FJobsID=@FNJobsID,FJobID=@FJobIDs where FEmplID = @FEmplID update Ba_Manager set FDepaID = @FNDepaID,FJobID=@FNJobsID where FEmplID = @FEmplID end else begin update Hr_Employee set FDepaID = @FNDepaID,FJobsID=@FNJobsID,FJobID=@FJobID where FEmplID = @FEmplID update Ba_Manager set FDepaID = @FNDepaID,FJobID=@FNJobsID where FEmplID = @FEmplID end end 给这段代码加注释
时间: 2023-02-06 21:50:15 浏览: 58
这段代码看起来像是在执行更新操作。
它使用了一些变量,包括 `@FJobID` 和 `@FJobIDs`,以及 `@FJDate`、`@FNDepaID` 和 `@FNJobsID`。
它首先检查 `@FJDate` 是否早于 2015 年 3 月 27 日。如果是,则执行一些操作,否则什么都不做。
在执行操作的情况下,它会尝试查询 `Hr_Job` 表中是否存在 `FDepaID` 为 `@FNDepaID`,`FJobsID` 为 `@FNJobsID` 的记录。如果存在,则设置 `@FJobID` 为该记录的 `FJobID` 值。
如果找不到这样的记录(即 `@FJobID` 为空),则会向 `Hr_Job` 表插入一条新记录,将 `FJobsID` 设置为 `@FNJobsID`,将 `FDepaID` 设置为 `@FNDepaID`。然后,它会设置 `@FJobIDs` 为插入的新记录的自增 ID 值,并使用这个值来更新 `Hr_Employee` 和 `Ba_Manager` 两个表中的记录。
如果找到了这样的记录(即 `@FJobID` 不为空),则会使用 `@FJobID` 的值来更新 `Hr_Employee` 和 `Ba_Manager` 两个表中的记录。
相关问题
create trigger tri_jieshu on reader_borrow for insert as declare @id varchar(50) select @id=borrow_id from inserted update book_borrowing set book_surplus=book_surplus-1 where book_id=@id create trigger tri_huanshu on reader_back for insert as declare @id varchar(50) select @id=back_id from inserted update book_borrowing set book_surplus=book_surplus+1 where book_id=@id create proc payment @id varchar(20),@name varchar(20) as begin select borrow_date,back_date from reader_back,reader_borrow where back_id=borrow_id and back_id=@id and borrow_bookname=back_bookname and (select datediff(day, borrow_date,back_date) FROM reader_back,reader_borrow)>7 end create view view_pay as select * from reader_back,reader_borrow where (borrow_id=back_id and borrow_bookname=back_bookname) create proc proc_pay (@id varchar(20)) as select back_id,back_bookname,back_date,borrow_date from view_pay where back_id=@id exec proc_pay @id='1'该代码有什么语法错误
在触发器 tri_jieshu 和 tri_huanshu 中,update 语句中的 where 子句需要指定 book_id 而不是 borrow_id 和 back_id。应该修改为:
```
update book_borrowing set book_surplus=book_surplus-1 where book_id=(select book_id from inserted)
```
和
```
update book_borrowing set book_surplus=book_surplus+1 where book_id=(select book_id from inserted)
```
在 payment 存储过程中,应该将 datediff 函数的返回值赋值给一个变量,然后使用该变量进行比较。应该修改为:
```
create proc payment @id varchar(20),@name varchar(20) as
begin
declare @days int
select @days = datediff(day, borrow_date,back_date) FROM reader_back,reader_borrow
where back_id=borrow_id and back_id=@id and borrow_bookname=back_bookname
if (@days > 7)
begin
select borrow_date,back_date from reader_back,reader_borrow
where back_id=borrow_id and back_id=@id and borrow_bookname=back_bookname
end
end
```
在 proc_pay 存储过程中,应该将 @id 的数据类型修改为 varchar(50),并且在查询结果中使用别名来避免列名冲突。应该修改为:
```
create proc proc_pay (@id varchar(50)) as
begin
select b.back_id, b.back_bookname, b.back_date, r.borrow_date
from reader_back b, reader_borrow r
where b.back_id = r.borrow_id and b.back_id = @id and b.borrow_bookname = r.back_bookname
end
exec proc_pay @id='1'
```
2),创建一个带参数存储过程stu_age,该存储过程根据输入的学号,在student表中计算此学生的年龄,并根据不同结果返回不同值:执行成功,返回0,执行出错,返回-1
以下是创建带参数存储过程stu_age的SQL代码:
```
CREATE PROCEDURE stu_age
@stu_id INT,
@age INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @dob DATE
SELECT @dob = dob FROM student WHERE id = @stu_id
IF @dob IS NULL
BEGIN
-- 学号不存在
RETURN -1
END
ELSE
BEGIN
-- 计算年龄
SET @age = DATEDIFF(YEAR, @dob, GETDATE())
IF (MONTH(@dob) > MONTH(GETDATE())) OR (MONTH(@dob) = MONTH(GETDATE()) AND DAY(@dob) > DAY(GETDATE()))
BEGIN
SET @age = @age - 1
END
RETURN 0
END
END
```
该存储过程有两个参数:输入参数@stu_id表示学生的学号,输出参数@age表示计算出来的年龄。存储过程会根据输入的学号在student表中查询出该学生的出生日期,并根据当前日期计算出学生的年龄。如果输入的学号不存在,则返回-1表示执行出错;否则返回0表示执行成功。