首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

初学 sql存储过程和触发器,该如何解决

2012-06-15 
初学 sql存储过程和触发器sql server存储过程的 流控制语言具体怎么用?请大家举个列子详细 解释下哈还有触

初学 sql存储过程和触发器
sql server 
存储过程的 流控制语言具体怎么用?

请大家举个列子详细 解释下哈

还有触发器的 print方面的也举个列子(列如:成绩大于100或小于0 则不能保存)……等等……  
谢谢 谢谢大家啊!


[解决办法]
这段在我网上,先给你参考:

SQL code
4. 程序流程控制    打开查询分析器,在查询窗口输入下列程序,理解其中条件语句、循环语句、等待语句的写法。运行程序时,注意查询分析器状态栏上的执行时间提示(程序保存为s6_4.sql)。/*随机产生十个两位数,求出奇数和偶数的个数及各自的和,并延时输出*/DECLARE @a int, @b1 int, @b2 int, @c1 int, @c2 int, @i intSET @i=0SET @b1=0SET @b2=0SET @c1=0SET @c2=0WHILE @i<10  BEGIN    SET @a=floor(89*rand())+10    PRINT @a    IF @a % 2=0      BEGIN        SET @b1=@b1+@a        SET @c1=@c1+1      END    ELSE      BEGIN        SET @b2=@b2+@a        SET @c2=@c2+1      END    SET @i=@i+1  ENDWAITFOR DELAY '000:00:10'SELECT @c1 as 偶数个数, @b1 as 偶数和, @c2 as 奇数个数, @b2 as 奇数和GO
[解决办法]
晴天大大出书了?
什么书?
改明儿去买一本!
[解决办法]
表示关注您的出书!
[解决办法]
菜鸟的我在学习中
[解决办法]
存储过程(feixianxxx)
http://topic.csdn.net/u/20091127/21/10a70c07-8683-4f9e-be7e-2415fa8f6956.html?seed=296887941&r=61490884#r_61490884

有关存储过程的讨论
http://topic.csdn.net/u/20080511/21/ffe1bd32-fff2-4067-bcf9-cadea806ac8f.html?1953379669

常用存储过程语法收藏 
http://topic.csdn.net/u/20090216/10/fca7534f-e881-4e37-b9b7-8fe141ee186b.html?15784
[解决办法]
触发器综述
http://topic.csdn.net/u/20081005/11/57061a18-c234-40ee-ba4b-1f4c3bc7f09a.html

T-MAC学习笔记19之--浅谈触发器
http://topic.csdn.net/u/20091203/20/ef22e48d-4560-437e-9500-6efa4044284d.html?41106

SQL code
--触发器的操作1create table 化验室纱组(本厂编号 int,客户 int,色号 int,纱支 int)create table 化验室布组(本厂编号 int,客户 int,色号 int,布类 int)gocreate trigger my_trig on 化验室纱组 for insert ,update ,deleteasif not exists(select 1 from inserted)   delete 化验室布组 from deleted t where 化验室布组.本厂编号 = t.本厂编号 else if not exists(select 1 from deleted)    insert into 化验室布组(本厂编号 ,客户 ,色号) select 本厂编号 ,客户 ,色号 from insertedelse   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)goselect * from 化验室布组/*本厂编号        客户          色号          布类          ----------- ----------- ----------- ----------- 1           2           3           NULL5           6           7           NULL(所影响的行数为 2 行)*/--2、update , 更改化验室纱组表中本厂编号=1的色号=6update 化验室纱组 set 色号 = 6 where 本厂编号 = 1goselect * from 化验室布组/*本厂编号        客户          色号          布类          ----------- ----------- ----------- ----------- 1           2           6           NULL5           6           7           NULL(所影响的行数为 2 行)*/--3、delete 化验室纱组表中本厂编号=1的那条数据delete from 化验室纱组 where 本厂编号 = 1goselect * from 化验室布组/*本厂编号        客户          色号          布类          ----------- ----------- ----------- ----------- 5           6           7           NULL(所影响的行数为 1 行)*/drop table 化验室纱组 , 化验室布组
[解决办法]
SQL code
drop table classname declare @TeacherID int declare @a char(50) declare @b char(50) declare @c char(50) declare @d char(50) declare @e char(50) set @TeacherID=1 select @a=DRClass1, @b=DRClass2, @c=DRClass3, @d=DRClass4, @e=DRClass5 from Teacher Where TeacherID = @TeacherID create table classname(classname char(50)) insert into classname (classname) values (@a) if (@b is not null) begin insert into classname (classname) values (@b) if (@c is not null) begin insert into classname (classname) values (@c) if (@d is not null) begin insert into classname (classname) values (@d) if (@e is not null) begin insert into classname (classname) values (@e) end end end end select * from classname 以上这些SQL语句能不能转成一个存储过程?我自己试了下 ALTER PROCEDURE Pr_GetClass @TeacherID int, @a char(50), @b char(50), @c char(50), @d char(50), @e char(50) as select @a=DRClass1, @b=DRClass2, @c=DRClass3, @d=DRClass4, @e=DRClass5 from Teacher Where TeacherID = @TeacherID DROP TABLE classname create table classname(classname char(50)) insert into classname (classname) values (@a) if (@b is not null) begin insert into classname (classname) values (@b) if (@c is not null) begin insert into classname (classname) values (@c) if (@d is not null) begin insert into classname (classname) values (@d) if (@e is not null) begin insert into classname (classname) values (@e) end end end end select * from classname 但是这样的话,这个存储过程就有6个变量,实际上应该只提供一个变量就可以了 主要的问题就是自己没搞清楚 @a,@b,@C,@d 等是临时变量,是放在as后面重新做一些申明的,而不是放在开头整个存储过程的变量定义。 


[解决办法]

SQL code
常用的系统存储过程:EXEC sp_databases --列出服务器上所有数据库EXEC sp_helpdb --报告有关指定数据库或所有数据库的信息EXEC sp_renamedb '原数据库名','新数据库名' --更改数据库名(单拥护访问)EXEC sp_tables --当前数据库可查看的列表EXEC sp_columns 表名 --返回某个表列的信息EXEC sp_help 表名 --查看某个表的所有信息EXEC sp_helpconstraint 表名 --查看某个表的约束EXEC sp_helpindex 表名 --查看某个表的索引EXEC sp_stored_procedures --列出当前环境中所有存储过程自定义存储过程:语法:CREATE     PROCEDURE     存储过程名@参数1 数据类型 = 默认值 OUTPUT@参数2 数据类型 = 默认值 OUTPUT……AS SQL语句例子(无参):--检测是否存在IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME = 'proc_stu')DROP PROCEDURE     proc_stu--创建存储过程CREATE PROCEDURE     proc_stuASprint '打印出stuMarks表中的信息'SELECT * FROM stuMarksGO--调用EXEC proc_stu例子(有参):    例1接受参数(不写OUTPUT)--检测是否存在IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME = 'proc_stu')DROP PROCEDURE     proc_stu--创建存储过程CREATE PROCEDURE     proc_stu@anum int=60,@bnum int=100ASprint '打印出两个参数'print @anumprint @bnumGO--调用存储过程EXEC proc_stu EXEC proc_stu 50EXEC proc_stu default,40EXEC proc_stu 50,40EXEC proc_stu @anum=50,@bnum=40例2输出参数,带OUTPUT--检测是否存在IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME = 'proc_stu')DROP PROCEDURE     proc_stu--创建存储过程CREATE PROCEDURE     proc_stu@cnum int OUTPUT @anum int=60,@bnum int=100ASset @cnum=10print '打印出两个参数'print @anumprint @bnumGO--调用存储过程DECLARE @SUN    int --定义变量用语存储调用存储过程返回的结果EXEC proc_stu    @SUN CUTPUT总结:      1.什么是存储过程:(Procedure),它是SQL语句和控制流语句的预编译集合。它可以接受参数、输出参数、返回单个或多个结果集以及返回值(加如RETURN)      2.使用存储过程的优点:允许模块化程序设计;允许更快的执行;减少网络流量;      3.分类:①系统存储过程类似C语言中的系统函数;②用户定义的存储过程类似C语言中的自定义函数 

热点排行