怎么写触发器和存储过程/函数??????

飞火流星02027 2009-09-24 03:07:10

怎么写触发器和存储过程/函数??????
有两个表,一个存储位置参数表:
CREATE TABLE T_PUB_CCWZCS
(
N_GH tinyint PRIMARY KEY,//柜号(2位)
N_ZGCS tinyint,//总共层数(2位)
N_KFHS tinyint,//可放盒数(2位)
N_KFPS tinyint,//可放盘数(3位)
)

存储位置表:
CREATE TABLE T_GPGL_CCWZ
(
C_CCWZID varchar(8) 主键,形式:(01-01-01)柜号(2位)+层号(2位)+盒号(2位)
N_GH tinyint, //柜号(2位)
N_CH tinyint, //层号(2位)
N_HH tinyint, //盒号(2位)
N_YS tinyint, //余数 (默认值是盒子子的容量)
)

CREATE TRIGGER MyfirstTrigger ON _PUB_CCWZCS
AFTER INSERT
AS
.........
怎么创建一个触发器(或都别的方法也行),做到如下功能:
当:
insert into T_PUB_CCWZCS //存储位置参数表
values(1,3,2,120);
之后马上:
insert into T_PUB_CCWZ //存储位置表
values(01-01-01,1,1,1,120);
insert into T_PUB_CCWZ
values(01-01-02,1,1,2,120);
insert into T_PUB_CCWZ
values(01-02-01,1,2,1,120);
insert into T_PUB_CCWZ
values(01-02-02,1,2,2,120);
insert into T_PUB_CCWZ
values(01-03-01,1,3,1,120);
insert into T_PUB_CCWZ
values(01-03-02,1,3,2,120);
当:
delete from T_PUB_CCWZCS where N_GH=1 //存储位置参数表
之后马上:
删除上面的记录!!

每当在into T_PUB_CCWZCS表中增加一条记录都会在存储位置表中增加该柜子的所有存储位置记录,
每当在into T_PUB_CCWZCS表中增加删除一订记录都会在存储位置表中删除该柜子的所有存储位置记录,
怎么写触发器和存储过程/函数??????
关于insert相关的下面的怎么改写就可以了????


CREATE TRIGGER MyfirstTrigger ON _PUB_CCWZCS
AFTER INSERT
AS
declare @i int,@j int,@t int;
select @i=N_ZGCS,@t=N_KFHS from inserted;
while @i>0
begin
set @j=@t;
while @j>0
begin
insert into T_GPGL_CCWZ(C_CCWZID,N_GH,N_CH,N_HH,N_YS) select N_GH+'-'+@i+'-'+@j,N_GH,@i,@j,N_KFPS from inserted;
set @j=@j-1
end
set @i=@i-1
end
[size=14px]怎么写触发器和存储过程/函数??????





...全文
107 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
哦,我for后面写掉了delete,谢谢了,js_szy!!!
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
奇怪,我看你写的也没有错啊??
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
delete对T_GPGL_CCWZ表的记录似乎没有影响啊??
华夏小卒 2009-09-24
  • 打赏
  • 举报
回复

---插入和删除

IF OBJECT_ID('T_PUB_CCWZCS') IS NOT NULL
DROP TABLE T_PUB_CCWZCS
Go
CREATE TABLE T_PUB_CCWZCS
(N_GH tinyint PRIMARY KEY,--//柜号
N_CS tinyint,--//层数
N_HS tinyint,--//盒数
N_PS tinyint,--//容量
)
IF OBJECT_ID('T_GPGL_CCWZ') IS NOT NULL
DROP TABLE T_GPGL_CCWZ
Go
CREATE TABLE T_GPGL_CCWZ
( ID int IDENTITY (1, 1) NOT NULL,
N_GH varchar(20), --//柜号
N_CH tinyint, --//层号
N_HH tinyint, --//盒号
N_YS tinyint, --//余数 (默认值是盒子子的容量) )
)

if object_id('gg') is not null drop trigger gg
go
create trigger gg on T_PUB_CCWZCS
for insert ,delete
as
if not exists(select 1 from deleted) ------- 插入
begin
declare @n int,@m int,@cs int,@hs int
set @cs=(select N_CS from inserted)
set @hs=(select N_HS from inserted)

set @n=1
set @m=1
while @n<=@cs
begin
while @m<=@hs
begin
insert T_GPGL_CCWZ
select right('0'+ltrim(N_GH),2)+'-'+right('0'+ltrim(@n),2)+'-'+right('0'+ltrim(@m),2),@n,@m,N_PS FROM inserted
set @m=@m+1
end

set @n=@n+1
set @m=1
end
end
else ----删除
begin
delete a
from T_GPGL_CCWZ a,deleted d
where cast(left(a.N_GH,2)as int)=d.N_GH
end

go

------------------------
insert into T_PUB_CCWZCS values(1,3,2,120)

insert into T_PUB_CCWZCS values(2,2,2,120)

select * from T_GPGL_CCWZ

ID N_GH N_CH N_HH N_YS
----------- -------------------- ---- ---- ----
1 01-01-01 1 1 120
2 01-01-02 1 2 120
3 01-02-01 2 1 120
4 01-02-02 2 2 120
5 01-03-01 3 1 120
6 01-03-02 3 2 120
7 02-01-01 1 1 120
8 02-01-02 1 2 120
9 02-02-01 2 1 120
10 02-02-02 2 2 120


delete from T_PUB_CCWZCS where N_GH=1
select * from T_GPGL_CCWZ

ID N_GH N_CH N_HH N_YS
----------- -------------------- ---- ---- ----
7 02-01-01 1 1 120
8 02-01-02 1 2 120
9 02-02-01 2 1 120
10 02-02-02 2 2 120

(4 行受影响)
华夏小卒 2009-09-24
  • 打赏
  • 举报
回复

IF OBJECT_ID('T_PUB_CCWZCS') IS NOT NULL
DROP TABLE T_PUB_CCWZCS
Go
CREATE TABLE T_PUB_CCWZCS
(N_GH tinyint PRIMARY KEY,--//柜号
N_CS tinyint,--//层数
N_HS tinyint,--//盒数
N_PS tinyint,--//容量
)
IF OBJECT_ID('T_GPGL_CCWZ') IS NOT NULL
DROP TABLE T_GPGL_CCWZ
Go
CREATE TABLE T_GPGL_CCWZ
( ID int IDENTITY (1, 1) NOT NULL,
N_GH varchar(20), --//柜号
N_CH tinyint, --//层号
N_HH tinyint, --//盒号
N_YS tinyint, --//余数 (默认值是盒子子的容量) )
)

if object_id('gg') is not null drop trigger gg
go
create trigger gg on T_PUB_CCWZCS
for insert
as
declare @n int,@m int,@cs int,@hs int
set @cs=(select N_CS from inserted)
set @hs=(select N_HS from inserted)

set @n=1
set @m=1
while @n<=@cs
begin
while @m<=@hs
begin
insert T_GPGL_CCWZ
select right('0'+ltrim(N_GH),2)+'-'+right('0'+ltrim(@n),2)+'-'+right('0'+ltrim(@m),2),@n,@m,N_PS FROM inserted
set @m=@m+1
end

set @n=@n+1
set @m=1
end
go

------------------------
insert into T_PUB_CCWZCS values(1,3,2,120)

select * from T_GPGL_CCWZ

ID N_GH N_CH N_HH N_YS
----------- -------------------- ---- ---- ----
1 01-01-01 1 1 120
2 01-01-02 1 2 120
3 01-02-01 2 1 120
4 01-02-02 2 2 120
5 01-03-01 3 1 120
6 01-03-02 3 2 120

(6 行受影响)
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
触发器中怎么定义char类型的变量啊?
bancxc 2009-09-24
  • 打赏
  • 举报
回复
看联机文档
飞火流星02027 2009-09-24
  • 打赏
  • 举报
回复
与刚才的不一样
华夏小卒 2009-09-24
  • 打赏
  • 举报
回复
刚不是发过了吗?
dawugui 2009-09-24
  • 打赏
  • 举报
回复
--触发器的操作1

create table 化验室纱组(本厂编号 int,客户 int,色号 int,纱支 int)
create table 化验室布组(本厂编号 int,客户 int,色号 int,布类 int)
go
create trigger my_trig on 化验室纱组 for insert ,update ,delete
as
if not exists(select 1 from inserted)
delete 化验室布组 from deleted t where 化验室布组.本厂编号 = t.本厂编号
else if not exists(select 1 from deleted)
insert into 化验室布组(本厂编号 ,客户 ,色号) select 本厂编号 ,客户 ,色号 from inserted
else
update 化验室布组 set 客户 = t.客户 , 色号 = t.色号 from inserted t where 化验室布组.本厂编号 = t.本厂编号
go

--1、insert 对化验室纱组插入数据,然后查看化验室布组表的数据
insert into 化验室纱组 values(1 , 2 , 3 , 4)
insert into 化验室纱组 values(5 , 6 , 7 , 8)
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
1 2 3 NULL
5 6 7 NULL

(所影响的行数为 2 行)
*/

--2、update , 更改化验室纱组表中本厂编号=1的色号=6
update 化验室纱组 set 色号 = 6 where 本厂编号 = 1
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
1 2 6 NULL
5 6 7 NULL

(所影响的行数为 2 行)
*/

--3、delete 化验室纱组表中本厂编号=1的那条数据
delete from 化验室纱组 where 本厂编号 = 1
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
5 6 7 NULL

(所影响的行数为 1 行)
*/

drop table 化验室纱组 , 化验室布组

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧