你的位置:
问答吧
-> 数据库
-> 问题详情
如何将查询结果作为条件放在触发器中?
仍然是做一个insert触发器,a表存学生班别姓名,当在表里查入班别,学生,这两个字段信息时,如果查到表中这个学生的名字已存在,就回滚。
我是这样想的,例如插入的是‘王二小’,在触发器里统计a表中姓名为‘王二小’的记录数,如果记录>1,则回滚。
但是代码怎么写呢?
我只写一半,但if语法不对:
create trigger students_insert
on a
for insert
as
select count (*) as counts from (select a.Name from inserted,a where inserted.Name=a.Name)
if counts>1
print '学生名已存在'
rollback transaction
作者: aair
发布时间: 2007-12-28
难道触发器里不能定义变量吗 ?
先定义一个变量, 把查询的结果 赋值给变量, 剩下的就是 T-SQL 编程的事情了。
[ 本帖最后由 magus163 于 2007-12-28 17:43 编辑 ]
作者: magus163
发布时间: 2007-12-28
还有, 我觉得这个用不着触发器, 给字段加个 唯一约束 就行了。
作者: magus163
发布时间: 2007-12-28
把查询结果赋值给变量似乎很麻烦?怎么写呢?
magus163
说的有道理。
我改了一下代码:
create trigger students_insert
on a
for insert
as
if exists(select Name from a group by Name having count(*)>1)
begin
print '学生名已存在'
rollback transaction
end
但是表里还是可以插入两个同名的,直到插入第三个同名的才产生回滚。
作者: aair
发布时间: 2007-12-28
改成
if exists(select Name from a group by Name having count(*)>0)
才是我想要的答案,就是只输入一次姓名,第二次就提示了。
这是怎么回事呢?
作者: aair
发布时间: 2007-12-28
I 服了 You , 用 declare 定义一个变量这么方便的事情你嫌麻烦, 你还是先找本 T-SQL 编成的基础书看看吧。
作者: magus163
发布时间: 2007-12-28
如何将“查询的结果 赋值给变量”,其实我的标题就是这个啊,你只是把我的问题重复了一遍。你叫我去学,我这不是在学么?
我现在面前有一大堆书呢,查了很多。我不用定义变量,嫌麻烦,有原因,等我成为高手之后我告诉你
答案我是得到了,就是将>1改为>0,这个问题告一段落。
现在新的问题的,insert触发器触发时,insert into语句是否已把内容插入到a表中?如果是,则是>1但现在是>0才得到正确答案,那么是还未插入?但是我之前用另一种方法
if exists(select a.Name from inserted,a where inserted.Name=a.Name)
却是一条也插不进去的。
谢谢大家理解我这么死脑筋。
作者: aair
发布时间: 2007-12-28
很简单, 有一条符合要求的纪录的时候, 是 =1, >1 就是2条纪录了
作者: magus163
发布时间: 2007-12-28
看来我没有正确理解这句:
if exists(select Name from a group by Name having count(*)>1)
我是这样理解的,如果>1的话,说明在a表里存在2条相同的记录了,那么就回滚。
现在正确的答案是>0,我理解为:如果>0,说明在a表里只有一条记录,回滚。那么回滚后,不是一条记录也没有了么?我无论插什么都是回滚了,什么都插不进去。就是这点不能理解。
作者: aair
发布时间: 2007-12-28
我好象能理解了:
1.王二小,张三,李四 这张表没有重复的记录,所有count=0
2.王二小,张三,张三,李四 这张表有1条重复的记录,count=1也就是>0,要回滚。
3.王二小,张三,张三,张三,李四 这张表有2条重复的记录,就是我做错的count>1.
谢谢,magus163
今天问题暂时解决了,关于还有更好的方法,定义变量什么的,我以后也一定会学到的。
CJJ今晚不用帮我学触发器了,呵呵,谢谢。
作者: aair
发布时间: 2007-12-28
怪了,又想不通了。想把上面的理解删掉
作者: aair
发布时间: 2007-12-28
唯一约束或索引就可以解决你的问题..
if counts>1
print '学生名已存在'
rollback transaction
多行要用
begin....end
否则认为只作用在下一行.
类似
if 1<0
print '1小于0?不对不对,,所以我不显示'
print '你1<0与我一毛钱关系没有,所以我可以显示'
if 1<0
begin
print '1大于0?不对不对,,所以我不显示'
print '我估计是不显示喽'
end
这样的话,一行也不会显示 喽.
作者: hzexe
发布时间: 2007-12-29
换了台机器
if exists(select Name from a group by Name having count(*)>1)
就正确了,说明>1的想法还是对的。
至于为什么原来的机器会这样,还要好好想想。
作者: aair
发布时间: 2008-01-01