发布网友 发布时间:2022-04-25 02:13
共6个回答
热心网友 时间:2022-04-10 17:00
你把你写的触发器发过来,我给你改。
我给你代码,全部都是试过的,所以你要相信这是正确的。不正确,是你抄的不正确。
====================
你这个问题看似简单,其实不简单,他需要三方面的关键技术:
1.使用触发器嵌套。
2.控制嵌套层次。
3.产生随机整数。(2010年的1-10随机数)
下面是我给您的全面解决方法:
--为避免您在抄录的过程中出现错误,使用我为您建立的表作试验,试好后再改到自已的表中,以下代码(包括注释)完全复制到查询分析器中即可执行,建测试表,建触发器,测试及查看语句均在其中,我已实际测试通过。
--一、建立测试表,TABLENAME,如果原来有这个表,要先用DROP TABLE TABLENAME 删掉,或改名也行。
-- 请注意,在表中有一个自增列,是为了保证不插入完全相同的列(在SQLSERVER中是不允许的),造成错误
CREATE TABLE TABLENAME(A varchar (16) NULL ,B float ,C float ,[id] int IDENTITY (1, 1) NOT NULL )
GO
--二、建立触发器
CREATE TRIGGER TR_TABLENAME_Insert ON TABLENAME
FOR INSERT
AS
declare--声明与插入字段数及类型相同的变量
@a VARCHAR(16),
@b float,
@c float
select --取得此次插入的值
@a=a,
@b=b,
@c=c
from inserted
DECLARE @N TINYINT --声明重复插入次数
SET @N=CASE WHEN YEAR(GETDATE())=2008 THEN 1 --2008年重复插入一次
WHEN YEAR(GETDATE())=2009 THEN 2 --2009年重复插入二次
ELSE cast(ceiling(rand() * 10) as int) --2010年及其它年份随机产生1-10之间的整数,作为插入次数
END
if @@NESTLEVEL <=@N --当插入次数不足设定次数时,继续插入上面的插入值。
INSERT INTO [TABLENAME]([A], [B], [C])
VALUES(@A,@b,@c)
GO
--三、测试:(可重复执行多次,来查看结果,可将计算机当前日期进行修改,以完成2009年以上的测试)
INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('TEST',1,1)
select * from TABLENAME
--还有一点,年份我取的是当前年份,如果是根据插入的字段值中的年分,那么就将该GETDATE()函数用为年份字段设置的变量代替,请注意字段类型的匹配就行了。
=============
怎么了?问题解决了就不差急了?
=====================================
你抄得一定有问题,从表到存储过程都直接复制就可以。
还有一种可能,年份是从数据库服务器的当前时间取的,你在试验时,要改数据库服务器的系统才行。
我的服务器是在本机,所以改服务器系统时间比较容易。
如果不方便改服务器时间,你可以用其它方式试验,如改成判断其它数据,下面我帮你改一个,通过判断A字段是2008,2009还是2010来确定重复次数。
ALTER TRIGGER TR_TABLENAME_Insert ON TABLENAME
FOR INSERT
AS
declare--声明与插入字段数及类型相同的变量
@a VARCHAR(16),
@b float,
@c float
select --取得此次插入的值
@a=a,
@b=b,
@c=c
from inserted
DECLARE @N TINYINT --声明重复插入次数
SET @N=CASE WHEN @A='2008' THEN 1 --2008年重复插入一次
WHEN @A='2009' THEN 2 --2009年重复插入二次
ELSE cast(ceiling(rand() * 10) as int) --2010年及其它年份随机产生1-10之间的整数,作为插入次数
END
if @@NESTLEVEL <=@N --当插入次数不足设定次数时,继续插入上面的插入值。
INSERT INTO [TABLENAME]([A], [B], [C])
VALUES(@A,@b,@c)
GO
--再次测试:下面是试验和查看三种结果,请注意,第一次多增加一条件记录,
第二次是多增加二条件记录,第三次是多增加1-10条件任意记录
INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('2008',1,1)
select * from TABLENAME
INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('2009',1,1)
select * from TABLENAME
INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('2010',1,1)
select * from TABLENAME
热心网友 时间:2022-04-10 18:18
/*建表Table1*/
CREATE TABLE Table1
(Eno NUMERIC(4) REFERENCES teacher(Eno),
Sal SUMERIC(7,2),
Username char(10),
Date TIMETAMP);
/*建立触发器*/
CREATE TRIGGER insert_RT
AFTER INSERT ON Table1
FOR EACH ROW
AS BEGIN
INSERT INTO Table1 VALUES(
new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
END;
热心网友 时间:2022-04-10 19:52
触发器向同一个表中添加数据?这样不进入死循环?
热心网友 时间:2022-04-10 21:44
楼主说的有点乱,说清楚点,其实触发器为非是在那三种情况下变换,没有什么很难的问题,说清楚点才能给你解决啊
热心网友 时间:2022-04-10 23:52
啥是触发器?
热心网友 时间:2022-04-11 02:16
可以说清楚一点吗,你要效果