tsql触发器

alinqqq 2015-08-16 10:17:59
--有两张表,客户表和项目表,要求:新建项目时自动生成项目编号,每个不同的客户的项目的编号从1开始
--项目编号格式为PJ+"-"+"客户编号"+"-"+"日期"+"-"+"流水号"
--如项目编号:PJ-ABCD-120805-0001

create table testAccount
(
tAccountName nvarchar(100),--客户名称
tAccId nvarchar(32) --客户编号
)
create table testProject
(
tProName nvarchar(100),--项目名称
tProId nvarchar(32), --项目编号
tIdAcc nvarchar(100), --客户编号
tProGuid nvarchar(64) --Guid
)
go
----------------------------------
alter trigger T_AutoNumber
on testProject
after insert
as
begin
declare @one nvarchar(8)
declare @two nvarchar(32)
declare @three nvarchar(8)
declare @four int
declare @guid nvarchar(64)
---------------------------------------------------
set @one='PJ'
set @three=convert(varchar(8),getdate(),112)
select @two=tIdAcc,@guid=tProGuid from inserted
select @four=max(cast(right(tProId,4)as int)) --这里的值应该是空值
from testProject
where tIdAcc=@two
------------------------------------------------
if @four is null --
set @four=0 --执行插入时,变量@four应该为0,为什么插入时得到的数字为0001呢?
else
set @four=cast(@four as int)
set @four=@four+1
--------------------------------------------------------
update testProject set tProId=@one+'-'+@two+'-'+@three+'-'+right('0000'+cast(@four as varchar),4)
where tProGuid=@guid
end
go
----------------------------------------------------------------------------------------------------------
在网上看到的触发器,有点看不明白:
插入一行数据时,@four变量应该为空啊,
select @four=max(cast(right(tProId,4)as int)) --这里的值应该是空值
from testProject
where tIdAcc=@two
----------------------------------
那么应该执行:
if @four is null --
set @four=0
得到的应该为0,
为什么,我插入一行时,@four会得到0001呢??

望解释下,刚开始学触发器,有点不明白!
...全文
89 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
引用 2 楼 milan_cn8 的回复:
我插入一条记录时,@four 值应为空值, select @four=max(cast(right(tProId,4)as int)) from testProject where tIdAcc=@two ----------------- 如果是空值的话,那么执行: if @four is null -- set @four=0 , 最后更新时, update testProject set tProId=@one+'-'+@two+'-'+@three+'-'+right('0000'+cast(@four as varchar),4) where tProGuid=@guid ---------------------------------------------------------- @four也应该是空值吧,为什么是1呢??这里想不明白啊
既然是1说明@four不是null,而是有值的。 你的是after insert厨废弃,那么: set @one='PJ' set @three=convert(varchar(8),getdate(),112) select @two=tIdAcc,@guid=tProGuid from inserted select @four=max(cast(right(tProId,4)as int)) --这里的值应该是空值 from testProject where tIdAcc=@two 这个红色的,就会查出数据来,所以就会有数据了
回复
Tiger_Zhao 2015-08-17
不是很清楚的吗?
if @four is null
set @four=0 -- 一个都不存在,已存在的编号算做0
else
set @four=cast(@four as int) -- 已存在的编号

set @four=@four+1 -- 无论是0还是已存在的编号,都+1作为下个编号
回复
alinqqq 2015-08-17
我插入一条记录时,@four 值应为空值, select @four=max(cast(right(tProId,4)as int)) from testProject where tIdAcc=@two ----------------- 如果是空值的话,那么执行: if @four is null -- set @four=0 , 最后更新时, update testProject set tProId=@one+'-'+@two+'-'+@three+'-'+right('0000'+cast(@four as varchar),4) where tProGuid=@guid ---------------------------------------------------------- @four也应该是空值吧,为什么是1呢??这里想不明白啊
回复
Tiger_Zhao 2015-08-17
所以逻辑是很清楚的,你看差了而已。
建议用代码格式化工具(比如 SQL Pretty Printer),将代码格式化一下,有了缩进后阅读就比较清晰了。
回复
alinqqq 2015-08-17
以下是我的理解: if @four is null set @four=0 -- 一个都不存在,已存在的编号算做0 else set @four=cast(@four as int) -- 已存在的编号 ---------------IF语句结束了 set @four=@four+1 -- 无论是0还是已存在的编号,都+1作为下个编号,自加1 -------------- 我一直以为: if @four is null set @four=0 -- 一个都不存在,已存在的编号算做0 else set @four=cast(@four as int) -- 已存在的编号 set @four=@four+1 -- 无论是0还是已存在的编号,都+1作为下个编号 --------------到这个位置-IF语句才结束 所以搞半天想不明白
回复
道玄希言 2015-08-16


update testProject set tProId=@one+'-'+@two+'-'+@three+'-'+right('0000'+cast(@four as varchar),4) 
where tProGuid=@guid

你插入语句是这句, 最后不是有个转化么, right('0000'+cast(@four as varchar),4) 就是将 int 类型的流水号 @four, 转成 varchar 类型的字符串, 然后用字符串 ’0000‘ 与字符串类型的 @four 相加, 再取右边四位。 也就是将int类型数字,转为varchar 类型, 不够4位, 左补零。
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-08-16 10:17
社区公告
暂无公告