精华内容
下载资源
问答
  • sql存储过程实例

    2018-01-29 15:01:11
    简单的oracle存储过程demo,可以参照写法写个存储过程玩玩
  • SQL存储过程实例.doc

    2010-06-30 17:21:43
    --1、创建存储过程-- if exists (select * from sysobjects where name='Sum_wage') drop procedure Sum_wage GO create procedure Sum_wage @PWage int, @AWage int, @total int as while (1=1) begin if (select...
  • SQL存储过程实例

    2015-04-20 15:58:20
    SQL存储过程实例,欢迎下载,希望对您有所帮助。
  • SQL存储过程实例详解

    千次阅读 2019-05-22 08:53:16
    SQL存储过程实例详解 本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能。 题目1 学校图书馆借书信息管理系统建立三个表: 学生信息表:student 字段名称 数据类型 ...

    SQL存储过程实例详解

          本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能。

    题目1

            学校图书馆借书信息管理系统建立三个表:

            学生信息表:student

    字段名称

    数据类型

    说明

    stuID

    char(10)

    学生编号,主键

    stuName

    Varchar(10)

    学生名称

    major

    Varchar(50)

    专业

            图书表:book

    字段名称

    数据类型

    说明

    stuID

    char(10)

    学生编号,主键

    stuName

    Varchar(10)

    学生名称

    major

    Varchar(50)

    专业

            借书信息表:borrow

    字段名称

    数据类型

    说明

    borrowID

    char(10)

    借书编号,主键

    stuID

    char(10)

    学生编号,外键

    BID

    char(10)

    图书编号,外键

    T_time

    datetime

    借书日期

    B_time

    datetime

    还书日期

            请编写SQL语句完成以下的功能:
    1) 查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示:

    2) 查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

    3) 查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期;参考查询结果如下图所示:

    4) 查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所示:

            附加:建表语句:

    [sql] view plain copy

    1. 复制代码

      USE master  
      GO  
      /*
       
       
       
      $建库
       
       
       
       
       
       
      */  
      --检验数据库是否存在,如果为真,删除此数据库--  
      IF exists(SELECT * FROM sysdatabases WHERE name='BOOK')  
        DROP DATABASE BOOK  
      GO  
      CREATE DATABASE BOOK  
      GO  
        
      --建数据表--  
      USE BOOK  
      GO  
      CREATE TABLE student  --学生信息表  
      (  
        stuID CHAR(10) primary key,  --学生编号  
        stuName  CHAR(10) NOT NULL ,     --学生名称  
        major  CHAR(50) NOT NULL    --专业  
      )  
      GO  
      CREATE TABLE book  --图书表  
      (  
        BID  CHAR(10) primary key,    --图书编号  
        title  CHAR(50) NOT NULL,  --书名  
        author  CHAR(20) NOT NULL,  --作者  
      )  
      GO  
      CREATE TABLE borrow  --借书表  
      (  
       borrowID  CHAR(10) primary key,    --借书编号  
      stuID CHAR(10) foreign key(stuID) references student(stuID), --学生编号  
      BID  CHAR(10) foreign key(BID) references book(BID),--图书编号  
       T_time  datetime NOT NULL,   --借出日期  
       B_time  datetime    --归还日期  
      )  
      GO  
        
      --学生信息表中插入数据--  
      INSERT INTO student(stuID,stuName,major)VALUES('1001','林林','计算机')  
      INSERT INTO student(stuID,stuName,major)VALUES('1002','白杨','计算机')  
      INSERT INTO student(stuID,stuName,major)VALUES('1003','虎子','英语')  
      INSERT INTO student(stuID,stuName,major)VALUES('1004','北漂的雪','工商管理')  
      INSERT INTO student(stuID,stuName,major)VALUES('1005','五月','数学')  
      --图书信息表中插入数据--  
      INSERT INTO book(BID,title,author)VALUES('B001','人生若只如初见','安意如')  
      INSERT INTO book(BID,title,author)VALUES('B002','入学那天遇见你','晴空')  
      INSERT INTO book(BID,title,author)VALUES('B003','感谢折磨你的人','如娜')  
      INSERT INTO book(BID,title,author)VALUES('B004','我不是教你诈','刘庸')  
      INSERT INTO book(BID,title,author)VALUES('B005','英语四级','白雪')  
      --借书信息表中插入数据--  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T001','1001','B001','2007-12-26',null)  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T002','1004','B003','2008-1-5',null)  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T003','1005','B001','2007-10-8','2007-12-25')  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T004','1005','B002','2007-12-16','2008-1-7')  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T005','1002','B004','2007-12-22',null)  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T006','1005','B005','2008-1-6',null)  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T007','1002','B001','2007-9-11',null)  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T008','1005','B004','2007-12-10',null)  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T009','1004','B005','2007-10-16','2007-12-18')  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T010','1002','B002','2007-9-15','2008-1-5')  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T011','1004','B003','2007-12-28',null)  
      INSERT INTO borrow(borrowID,stuID,BID,T_time,B_time)VALUES('T012','1002','B003','2007-12-30',null) 

      复制代码

       

            标准答案:-- 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、学生名称、图书编号、图书名称、借出日期—

    [sql] view plain copy

    1. select 学生编号=stuID,学生名称=(select stuName from student where stuID=borrow.stuID),图书编号=BID,图书名称=(select title from book where BID=borrow.BID),借出日期=T_time from borrow where stuID in (select stuID from student where major='计算机') and T_time>'2007-12-15' and T_time<'2008-1-8'  

       

    -- 2)查询所有借过图书的学生编号、学生名称、专业--

    [sql] view plain copy

    1. select 学生编号=stuID,学生名称=stuName,专业=major from student where stuID in (select stuID from borrow)  

       

    -- 3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期--

    [sql] view plain copy

    1. select 学生名称=(select stuName from student where stuID=borrow.stuID),图书名称=(select title from book where BID=borrow.BID),借出日期=T_time,归还日期=B_time from borrow where BID in (select BID from book where author='安意如') 

       

    -- 4)查询目前借书但未归还图书的学生名称及未还图书数量--

    [sql] view plain copy

    1. select 学生名称=(select stuName from student where stuID=borrow.stuID),借书数量=count(*) from borrow where B_time is null group by stuID  

       

    题目2

            程序员工资表:ProWage

    字段名称

    数据类型

    说明

    ID

    int

    自动编号,主键

    PName

    Char(10)

    程序员姓名

    Wage

    int

    工资

            创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱?

            例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

            请编写T-SQL来实现如下功能:
    1) 创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。
    2) 创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元,至到所有程序员平均工资达到4500元。

            建表语句:

    [sql] view plain copy

    复制代码

        USE master  
        GO  
        /*
         
         
         
        $建库
         
         
         
         
         
         
        */  
        --检验数据库是否存在,如果为真,删除此数据库--  
        IF exists(SELECT * FROM sysdatabases WHERE name='Wage')  
          DROP DATABASE Wage  
        GO  
        CREATE DATABASE Wage  
        GO  
          
        --建数据表--  
        USE Wage  
        GO  
        CREATE TABLE ProWage  --程序员工资表  
        (  
          ID int identity(1,1) primary key,  --工资编号  
          PName  CHAR(10) NOT NULL ,     --程序员姓名  
          Wage  int NOT NULL    --工资  
        )  
        GO  
        --插入数据--  
        INSERT INTO ProWage(PName,Wage)VALUES('青鸟',1900)  
        INSERT INTO ProWage(PName,Wage)VALUES('张三',1200)  
        INSERT INTO ProWage(PName,Wage)VALUES('李四',1800)  
        INSERT INTO ProWage(PName,Wage)VALUES('二月',3500)  
        INSERT INTO ProWage(PName,Wage)VALUES('蓝天',2780)  

    复制代码

     

            标准答案:

    [sql] view plain copy

    1. --1、创建存储过程--  

    题目3

            学生成绩信息三个表,结构如下: 
            学生表:Member

    字段名称

    数据类型

    说明

    MID

    Char(10)

    学生号,主键

    MName

    Char(50)

    姓名

            课程表:F

    字段名称

    数据类型

    说明

    FID

    Char(10)

    课程,主键

    FName

    Char(50)

    课程名

            成绩表:Score

    字段名称

    数据类型

    说明

    SID

    int

    自动编号,主键,成绩记录号

    FID

    Char(10)

    课程号,外键

    MID

    Char(10)

    学生号,外键

    Score

    int

    成绩

            请编写T-SQL语句来实现如下功能:
    1) 查询各个学生语文、数学、英语、历史课程成绩,例如下表:

    姓名

    语文

    数学

    英语

    历史

    张萨

    78 

    67

    89

    76

    王强

    89

    67

    84

    96

    李三

    70

    87

    92

    56

    李四

    80

    78

    97

    66

    2) 查询四门课中成绩低于70分的学生及相对应课程名和成绩。
    3) 统计各个学生参加考试课程的平均分,且按平均分数由高到底排序。
    4) 创建存储过程,分别查询参加1、2、3、4门考试及没有参加考试的学生名单,要求显示姓名、学号。

            建表语句:

    [sql] view plain copy

    复制代码

        USE master  
        GO  
        /*
         
         
         
        $建库
         
         
         
         
         
         
        */  
        --检验数据库是否存在,如果为真,删除此数据库--  
        IF exists(SELECT * FROM sysdatabases WHERE name='Student')  
          DROP DATABASE Student  
        GO  
        CREATE DATABASE Student  
        GO  
          
        --建数据表--  
        USE Student  
        GO  
        CREATE TABLE Member  --学生表  
        (  
          MID  char(10) primary key,  --学生号  
          MName  CHAR(50) NOT NULL  --姓名  
        )  
        GO  
        CREATE TABLE F  --课程表  
        (  
         FID   char(10) primary key,    --课程号  
        FName  CHAR(50) NOT NULL --课程名  
        )  
        GO  
        CREATE TABLE score  --学生成绩表  
        (  
          SID int identity(1,1) primary key,  --成绩记录号  
          FID char(10)  foreign key(FID) references F(FID) ,     --课程号  
          MID char(10)  foreign key(MID) references Member(MID) ,     --学生号  
          Score  int NOT NULL    --成绩  
        )  
        GO  
        --课程表中插入数据--  
        INSERT INTO F(FID,FName)VALUES('F001','语文')  
        INSERT INTO F(FID,FName)VALUES('F002','数学')  
        INSERT INTO F(FID,FName)VALUES('F003','英语')  
        INSERT INTO F(FID,FName)VALUES('F004','历史')  
        --学生表中插入数据--  
        INSERT INTO Member(MID,MName)VALUES('M001','张萨')  
        INSERT INTO Member(MID,MName)VALUES('M002','王强')  
        INSERT INTO Member(MID,MName)VALUES('M003','李三')  
        INSERT INTO Member(MID,MName)VALUES('M004','李四')  
        INSERT INTO Member(MID,MName)VALUES('M005','阳阳')  
        INSERT INTO Member(MID,MName)VALUES('M006','虎子')  
        INSERT INTO Member(MID,MName)VALUES('M007','夏雪')  
        INSERT INTO Member(MID,MName)VALUES('M008','璐璐')  
        INSERT INTO Member(MID,MName)VALUES('M009','珊珊')  
        INSERT INTO Member(MID,MName)VALUES('M010','香奈儿')  
        --成绩表中插入数据--  
        INSERT INTO Score(FID,MID,Score)VALUES('F001','M001',78)  
        INSERT INTO Score(FID,MID,Score)VALUES('F002','M001',67)  
        INSERT INTO Score(FID,MID,Score)VALUES('F003','M001',89)  
        INSERT INTO Score(FID,MID,Score)VALUES('F004','M001',76)  
        INSERT INTO Score(FID,MID,Score)VALUES('F001','M002',89)  
        INSERT INTO Score(FID,MID,Score)VALUES('F002','M002',67)  
        INSERT INTO Score(FID,MID,Score)VALUES('F003','M002',84)  
        INSERT INTO Score(FID,MID,Score)VALUES('F004','M002',96)  
        INSERT INTO Score(FID,MID,Score)VALUES('F001','M003',70)  
        INSERT INTO Score(FID,MID,Score)VALUES('F002','M003',87)  
        INSERT INTO Score(FID,MID,Score)VALUES('F003','M003',92)  
        INSERT INTO Score(FID,MID,Score)VALUES('F004','M003',56)  
        INSERT INTO Score(FID,MID,Score)VALUES('F001','M004',80)  
        INSERT INTO Score(FID,MID,Score)VALUES('F002','M004',78)  
        INSERT INTO Score(FID,MID,Score)VALUES('F003','M004',97)  
        INSERT INTO Score(FID,MID,Score)VALUES('F004','M004',66)  
        INSERT INTO Score(FID,MID,Score)VALUES('F001','M006',88)  
        INSERT INTO Score(FID,MID,Score)VALUES('F002','M006',55)  
        INSERT INTO Score(FID,MID,Score)VALUES('F003','M006',86)  
        INSERT INTO Score(FID,MID,Score)VALUES('F004','M006',79)  
        INSERT INTO Score(FID,MID,Score)VALUES('F002','M007',77)  
        INSERT INTO Score(FID,MID,Score)VALUES('F003','M008',65)  
        INSERT INTO Score(FID,MID,Score)VALUES('F004','M007',48)  
        INSERT INTO Score(FID,MID,Score)VALUES('F004','M009',75)  
        INSERT INTO Score(FID,MID,Score)VALUES('F002','M009',88)  

    复制代码

     

            标准答案:

    -- 1)查询各个学生语文、数学、英语、历史课程成绩--

    [sql] view plain copy

    复制代码

        SELECT Member.MName AS 姓名,  
        英语 = SUM(CASE F.FName WHEN '语文' THEN Score.Score END),   
        数学 = SUM(CASE F.FName WHEN '数学' THEN Score.Score END),   
        语文 = SUM(CASE F.FName WHEN '英语' THEN Score.Score END),   
        历史 = SUM(CASE F.FName WHEN '历史' THEN Score.Score END)   
        FROM Score, Member,F   
        WHERE F.FID = Score.FID AND Member.MID =Score.MID GROUP BY Member.MName   

    复制代码

     

    -- 2)查询四门课中成绩低于70分的学生及相对应课程名和成绩--

    [sql] view plain copy

    1. select 姓名=(select MName from Member where MID=Score.MID),课程名=(select FName from F where FID=Score.FID),成绩=Score from Score where Score<70  

       

    -- 3)统计各个学生四课程的平均分,且按平均分数由高到底排序--

    [sql] view plain copy

    1. select 姓名=(select MName from Member where MID=Score.MID),平均分=Avg(Score) from Score group by MID order by 平均分 desc  

    -- 4)创建存储过程--

    [sql] view plain copy

    复制代码

    if exists (select * from sysobjects where name='P_stu')  
    drop procedure P_stu  
    GO  
    create procedure P_stu  
    @num int  
    As  
    print'参加'+convert(varchar(5),@num)+'门课考试的学生姓名及学号:'  
    select 姓名=(select MName from Member where MID=Score.MID),学号=MID from Score group by MID having count(*)=@num   
      
    --调用存储过程--  
    exec P_stu @num=2  

    复制代码

    展开全文
  • 主要介绍了sql存储过程实例--动态根据表数据复制一个表的数据到另一个表的相关资料,需要的朋友可以参考下
  • 简单sql存储过程实例、储过程实战

    千次阅读 2019-01-06 15:18:36
    实例1:只返回单一记录集的存储过程。 银行存款表(bankMoney)的内容如下 Id userID Sex Money 001 Zhangsan 男 30 ...

    学习分享必看:javacto.taobao.com

    实例1:只返回单一记录集的存储过程。

    银行存款表(bankMoney)的内容如下

    Id

    userID

    Sex

    Money

    001

    Zhangsan

    30

    002

    Wangwu

    50

    003

    Zhangsan

    40

    要求1:查询表bankMoney的内容的存储过程

    create procedure sp_query_bankMoney
    as
    select * from bankMoney
    go
    exec sp_query_bankMoney

    注*  在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧!

    实例2(向存储过程中传递参数):

    加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。

    Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output
    with encryption ---------加密
    as
    insert bankMoney (id,userID,sex,Money)
    Values(@param1,@param2,@param3, @param4)
    select @param5=sum(Money) from bankMoney where userID='Zhangsan'
    go

    在SQL Server查询分析器中执行该存储过程的方法是:
    declare @total_price int
    exec insert_bank '004','Zhangsan','男',100,@total_price output
    print '总余额为'+convert(varchar,@total_price)
    go

    在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):

    1.以Return传回整数

    2.以output格式传回参数

    3.Recordset

    传回值的区别:

    output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。

    实例3:使用带有复杂 SELECT 语句的简单过程

      下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。

    USE pubs
    IF EXISTS (SELECT name FROM sysobjects
             WHERE name = 'au_info_all' AND type = 'P')
       DROP PROCEDURE au_info_all
    GO
    CREATE PROCEDURE au_info_all
    AS
    SELECT au_lname, au_fname, title, pub_name
       FROM authors a INNER JOIN titleauthor ta
          ON a.au_id = ta.au_id INNER JOIN titles t
          ON t.title_id = ta.title_id INNER JOIN publishers p
          ON t.pub_id = p.pub_id
    GO

      au_info_all 存储过程可以通过以下方法执行:

    EXECUTE au_info_all

    实例4:使用带有参数的简单过程

    CREATE PROCEDURE au_info
       @lastname varchar(40),
       @firstname varchar(20)
    AS
    SELECT au_lname, au_fname, title, pub_name
       FROM authors a INNER JOIN titleauthor ta
          ON a.au_id = ta.au_id INNER JOIN titles t
          ON t.title_id = ta.title_id INNER JOIN publishers p
          ON t.pub_id = p.pub_id
       WHERE  au_fname = @firstname
          AND au_lname = @lastname
    GO

      au_info 存储过程可以通过以下方法执行:

    EXECUTE au_info 'Dull', 'Ann'
    -- Or
    EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
    -- Or
    EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'

    实例5:使用带有通配符参数的简单过程

    CREATE PROCEDURE au_info2
    @lastname varchar(30) = 'D%',
    @firstname varchar(18) = '%'
    AS
    SELECT au_lname, au_fname, title, pub_name
    FROM authors a INNER JOIN titleauthor ta
       ON a.au_id = ta.au_id INNER JOIN titles t
       ON t.title_id = ta.title_id INNER JOIN publishers p
       ON t.pub_id = p.pub_id
    WHERE
    au_fname LIKE @firstname
       AND au_lname LIKE @lastname

    GO

      au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:

    EXECUTE au_info2
    -- Or
    EXECUTE au_info2 'Wh%'
    -- Or
    EXECUTE au_info2 @firstname = 'A%'
    -- Or
    EXECUTE au_info2 '[CK]ars[OE]n'
    -- Or
    EXECUTE au_info2 'Hunter', 'Sheryl'
    -- Or
    EXECUTE au_info2 'H%', 'S%'

    展开全文
  • VB SQL存储过程实例

    2013-04-16 22:21:59
    VB SQL存储过程实例,简单适用!已通过VB6测试。。
  • 详细实例全面解析SQL存储过程

    万次阅读 多人点赞 2019-04-09 16:39:41
    存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,类似一门程序设计语言,也包括了数据类型、流程控制、输入和输出和它自己的函数库。存储过程可以说是一个记录集,...不过SQL存储过程对于一些初学者...

    存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,类似一门程序设计语言,也包括了数据类型、流程控制、输入和输出和它自己的函数库。存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。不过SQL存储过程对于一些初学者来说还是比较抽象难理解的,因此本文将由浅至深地剖析SQL存储过程,帮助你学习它。

     

    存储过程的优点

     

    1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度,效率要比T-SQL语句高。


    2.当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

     

    3、一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。


    4.存储过程可以重复使用,可减少数据库开发人员的工作量。


    5.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
     

    存储过程基本语法

    --------------创建存储过程-----------------
    
    CREATE PROC [ EDURE ] procedure_name [ ; number ]
        [ { @parameter data_type }
            [ VARYING ] [ = default ] [ OUTPUT ]
        ] [ ,...n ]
    
    [ WITH
        { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
    
    [ FOR REPLICATION ]
    
    AS sql_statement [ ...n ]
    
    --------------调用存储过程-----------------
    
    EXECUTE Procedure_name '' --存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value
    
    --------------删除存储过程-----------------
    
    drop procedure procedure_name    --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程
    

     

    创建存储过程的参数

    1.procedure_name :存储过程的名称,在前面加#为局部临时存储过程,加##为全局临时存储过程。

    2.; number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。 

    3.@parameter:存储过程的参数。可以有一个或多个。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2100 个参数。 


    使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。 

    4.data_type:参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。 
    说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。 

    5.VARYING:指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。 

     

    6.default: 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。

     

    7.OUTPUT:表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。 

     

    8.RECOMPILE: 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。

     

    9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。 说明在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。 

     

    10.FOR REPLICATION:指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。 

     

    11.AS:指定过程要执行的操作。

     

    12.sql_statement:过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。

     

    实例操作学习

    下面通过表Student来具体了解一下存储过程,因为是要了解存储过程的简单用法,所以例子很简单。

     

    Student

     

    无参数存储过程:


    选出Student表中的所有信息

     

    create proc StuProc
    as      //此处 as 不可以省略不写
    begin   //begin 和 end 是一对,不可以只写其中一个,但可以都不写
    select S#,Sname,Sage,Ssex from student
    end
    go
    

     

     

    有参数存储过程:


    全局变量

    全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。


    选出指定姓名的学生信息:

     

    create proc StuProc
    @sname varchar(100)   
    as 
    begin
    select S#,Sname,Sage,Ssex from student where sname=@sname
    end
    go
    
    exec StuProc '赵雷'   //执行语句
    

     

     

    上面是在外部给变量赋值,也可以在内部直接给变量设置默认值

    create proc StuProc
    @sname varchar(100)='赵雷'
    as 
    begin
    select S#,Sname,Sage,Ssex from student where sname=@sname
    end
    go
    
    exec StuProc
    

     

     

    也可以把变量的内容输出,使用output

    create proc StuProc
    @sname varchar(100),
    @IsRight int  output //传出参数
    as 
    if exists (select S#,Sname,Sage,Ssex from student where sname=@sname)
    set @IsRight =1
    else
    set @IsRight=0
    go
    
    declare @IsRight int 
    exec StuProc '赵雷' , @IsRight output
    select @IsRight
    

    以上是全局变量,下面来了解局部变量
     

     

    局部变量:

    局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。

     

    局部变量的定义:

    必须先用Declare命令定以后才可以使用,declare{@变量名 数据类型}

     

    局部变量的赋值方法:

    set{@变量名=表达式}或者select{@变量名=表达式}

     

    局部变量的显示:

     

    create proc StuProc
    as 
    declare @sname varchar(100)
    set @sname='赵雷'
    select S#,Sname,Sage,Ssex from student where sname=@sname
    go
    
    exec StuProc
    

     

     

    那如果是要把局部变量的数据显示出来怎么办呢?

    create proc StuProc
    as 
    declare @sname varchar(100)
    set @sname=(select Sname from student where S#=01)
    select @sname
    go
    
    exec StuProc

     

     

    更详细的实例操作学习

    比如,在SQL Server查询编辑器窗口中用CREATE PROCEDURE语句创建存储过程PROC_InsertEmployee,用于实现向员工信息表(tb_Employee)中添加信息,同时生成自动编号。其SQL语句如下:

    IF EXISTS (SELECT name  
       FROM   sysobjects  
       WHERE  name = 'Proc_InsertEmployee'  
       AND          type = 'P') 
    DROP PROCEDURE Proc_InsertEmployee 
    GO 
    CREATE PROCEDURE Proc_InsertEmployee 
    @PName nvarchar(50), 
    @PSex nvarchar(4), 
    @PAge int, 
    @PWage money 
    AS 
    begin 
       declare @PID nvarchar(50) 
       select @PID=Max(员工编号) from tb_Employee 
       if(@PID is null) 
           set @PID='P1001' 
       else 
           set @PID='P'+cast(cast(substring(@PID,2,4) as int)+1 as nvarchar(50)) 
       begin 
           insert into tb_Employee values(@PID,@PName,@PSex,@PAge,@PWage) 
       end 
    end 
    go 
    

     

    存储过程的修改:

    创建完存储过程之后,如果需要重新修改存储过程的功能及参数,可以在SQL Server 2005中通过以下两种方法进行修改:一种是用Microsoft SQL Server Mangement修改存储过程;另外一种是用T-SQL语句修改存储过程。
     

    使用Microsoft SQL Server Mangement修改存储过程,步骤如下:
        

    (1)在SQL Server Management Studio的“对象资源管理器”中,选择要修改存储过程所在的数据库(如:db_18),然后在该数据库下,选择“可编程性”。
        

    (2)打开“存储过程”文件夹,右键单击要修改的存储过程(如:PROC_SEINFO),在弹出的快捷菜单中选择“修改”命令,将会出现查询编辑器窗口。用户可以在此窗口中编辑T-SQL代码,完成编辑后,单击工具栏中的“执行(X)”按钮,执行修改代码。用户可以在查询编辑器下方的Message窗口中看到执行结果信息。
     

    使用Transact-SQL修改存储过程: 

     

    使用ALTER PROCEDURE语句修改存储过程,它不会影响存储过程的权限设定,也不会更改存储过程的名称。
     

    语法:

    ALTER PROC [ EDURE ] procedure_name [ ; number ] 
        [ { @parameter data_type }  
             [ VARYING ] [ = default ] [ OUTPUT ] 
        ] [ ,...n ]  
    [ WITH 
        { RECOMPILE | ENCRYPTION 
            | RECOMPILE , ENCRYPTION   }  
    ] 
    [ FOR REPLICATION ]  
    AS 
        sql_statement [ ...n ]
    


    参数说明:

     

    procedure_name:是要更改的存储过程的名称。

     

    交叉链接:关于ALTER PROCEDURE语句的其他参数与CREATE PROCEDURE语句相同,可参见上面的“创建存储过程的参数”。

     

    例如,修改存储过程PROC_SEINFO,用于查询年龄大于35的员工信息。SQL语句如下:

     

    ALTER PROCEDURE [dbo].[PROC_SEINFO] 
    AS 
    BEGIN 
    SELECT * FROM tb_Employee where 员工年龄>35 
    END
    

     

     

    存储过程的删除:

    使用Microsoft SQL Server Mangement删除存储过程,步骤如下:

        

    (1)在SQL Server Management Studio的“对象资源管理器”中,选择要删除存储过程所在的数据库(如:db_student),然后在该数据库下选择“可编程性”。
        

    (2)打开“存储过程”文件夹,右键单击要删除的存储过程(如:PROC_SEINFO),在弹出的快捷菜单中选择“删除”命令。
     

    (3)单击“确定”按钮,即可删除所选定的存储过程。
       

    注意:删除数据表后,并不会删除相关联的存储过程,只是其存储过程无法执行。
     

    使用T-SQL删除存储过程:
        

    DROP PROCEDURE语句用于从当前数据库中删除一个或多个存储过程或过程组。
       

    语法:

     

    DROP PROCEDURE { procedure } [ ,...n ]
    

     

     

    参数说明:
        

    Procedure:是要删除的存储过程或存储过程组的名称。过程名称必须符合标识符规则。可以选择是否指定过程所有者名称,但不能指定服务器名称和数据库名称。
       

    n:是表示可以指定多个过程的占位符。
        

    例如删除PROC_SEINFO存储过程的SQL语句如下。

     

    DROP PROCEDURE PROC_SEINFO
    

    例如,删除多个存储过程proc10、proc20和proc30。

    DROP PROCEDURE proc10, proc20, proc30
    

     例如,删除存储过程组procs(其中包含存储过程proc1、proc2、proc3)。

     

     

    DROP PROCEDURE procs
    

    注意:SQL语句DROP不能删除存储过程组中的单个存储过程。
     

     

    应用存储过程验证用户登录身份:

    目前,验证用户登录身份的方法有多种,而通过调用存储过程来实现用户身份验证是目前最好的解决方案之一。因为存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句要快得多。
        

    本例是通过调用存储过程来验证用户登录的用户名和密码是否正确。运行本实例,在“用户名”和“密码”文本框中输入相应的用户名和密码,单击“登录”按钮即可。
     

    程序开发步骤:
     

    (1)新建一个网站,将其命名为"index",默认主页名为Default.aspx。
        

    (2)Default.aspx页面涉及到的控件如表1所示。

     

    Default.aspx页面涉及到的控件

     

    (3)主要程序代码如下。
    打开SQL Server Management Studio,并连接到SQL Server2005中的数据库。单击工具栏中“ ”按钮,新建查询编辑器。在该查询编辑器中,创建验证登录用户身份的存储过程PROC_EXISTS,具体的SQL语句如下:

     

    CREATE PROC PROC_EXISTS 
    ( 
    @UserName NVARCHAR(20), 
    @PassWord NVARCHAR(20), 
    @ReturnValue int OUTPUT 
    ) 
    AS 
    IF EXISTS(select * from tb_member where userName=@UserName AND passWord=@PassWord) 
           set @ReturnValue= 100 
    ELSE 
           set @ReturnValue= -100 
    GO
    

     

     

    在"登录"按钮的Click事件下,执行验证登录用户身份的存储过程,如果输入的用户名和密码正确,则弹出对话框提示用户登录成功,代码如下:

     

    protected void btnLogin_Click(object sender, EventArgs e) 
        { 
            //连接数据库 
            myConn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString()); 
            myCmd = new SqlCommand("PROC_EXISTS", myConn);   //调用存储过程,判断用户是否存在
            myCmd.CommandType = CommandType.StoredProcedure; 
            //为存储过程的参数赋值 
            SqlParameter userName=new SqlParameter("@UserName", SqlDbType.NVarChar, 20); 
            userName.Value=this.txtName.Text.Trim(); 
            myCmd.Parameters.Add(userName); 
            SqlParameter passWord=new SqlParameter("@PassWord", SqlDbType.NVarChar, 20); 
            passWord.Value = this.txtPassword.Text.Trim(); 
            myCmd.Parameters.Add(passWord); 
            //指出该参数是存储过程的OUTPUT参数 
            SqlParameter ReturnValue = new SqlParameter("@ReturnValue",SqlDbType.Int ,4); 
            ReturnValue.Direction = ParameterDirection.Output; 
            myCmd.Parameters.Add(ReturnValue); 
            try 
            { 
                myConn.Open(); 
                myCmd.ExecuteNonQuery(); 
                if (int.Parse(ReturnValue.Value.ToString()) == 100) 
                { 
                    Response.Write("<script>alert('您是合法用户,登录成功!')</script>"); 
                    return; 
                } 
                else 
                { 
                    Response.Write("<script>alert('您输入的用户名和密码不正确,请重新输入!')</script>"); 
                    return; 
                } 
            } 
            catch(Exception ex) 
            { 
                Response.Write(ex.Message.ToString()); 
            } 
            finally 
            { 
                myConn.Close(); 
                myConn.Dispose(); 
                myCmd.Dispose(); 
            }}
    展开全文
  • sql试题及答案,sql 行列转换,sql存储过程实例
  • 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回...
  • pl/sql 存储过程实例

    千次阅读 2012-05-06 00:51:39
    create or replace function IsDone(s_id in varchar2,s_TaskNum in ...功能描述:此存储过程用来验证任务是否完成,有无异常 传入参数3个,分别不同类型,返回值integer类型 返回值:0 正常、1 执行sql错误 、-
    create or replace function IsDone(s_id in varchar2,s_TaskNum in varchar2,s_TaskType in integer)
      return integer is
      /*
    功能描述:此存储过程用来验证任务是否完成,有无异常
    传入参数3个,分别不同类型,返回值integer类型
    返回值:0 正常、1 执行sql错误 、-1存储过程调用有误
      */
      //定义变量
      type   stringArr   is   varray(2)   of   varchar2(30); //定义一个定长的字符串数组数据类型  
      dflag          integer;//返回值
      iCount         integer;
      strs           stringArr;
      s_taskid       varchar2(20);
    begin
      begin
      iCount := splitstr(s_TaskNum, '_', strs);//自定义函数,截取字符串
      s_taskid:=strs(1);
      
        select  flag
          into dflag
          from table_Task t
         where taskid = s_taskid
           and id=s_id
           and taskType = s_TaskType
           and rownum=1
         order by flag asc;
        exception
        when others then
          return 1;//执行sql语句异常
      end;
      return dflag;
    EXCEPTION
      when others then
        return - 1;//调用存储过程失败
    END IsDone;
    


     

    展开全文
  • 为大家介绍sql server存储过程中if esle的用法,供大家学习参考。数据库中有两张表,A表主键为自动增长的并且是B表的外键且允许为空
  • sql存储过程实例下载

    2010-12-25 10:37:18
    一些有关SQL存储过程实例,1、学校图书馆借书信息管理系统。2、程序员工资
  • 介绍SQL server存储过程语法,并给出相关实例。简明,好用,好查。
  • SQL 存储过程 procedure 讲解+代码实例

    千次阅读 多人点赞 2020-04-09 20:34:02
    存储过程和函数在实际项目中的使用2. 存储过程与函数的比较2.1. 共同点2.2. 不同点3. 存储过程 Stored Procedure3.1. 存储过程概述3.1.1. 存储过程的优点3.1.2. 存储过程的缺点3.2. 创建存储过程 create procedure...
  •  作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:  CREATE PROCEDURE GetContactFormalNames   AS  BEGIN  SELECT TOP 10 Title + "" "" + FirstName + "" "" + LastName ...
  • 主要给大家介绍了关于SQL Server存储过程在C#中调用的简单实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL Server存储过程具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 本资源结合实例实现一个复杂的存储过程存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。
  • 主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样可以省去很多自定义的代码,需要的朋友...
  • SqlServer获取存储过程返回值的实例,需要的朋友可以参考一下
  • 1、创建好mybatis的Mapper文件 在接口文件中声明好接口以及返回的参数类型 Map&...2、Mapper.xml文件中的对应调用存储过程的方式如下 &amp;amp;lt;select id=&amp;quot;getGoodsInf
  • sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解。 例1: create proc proc_...
  • NULL 博文链接:https://baobeituping.iteye.com/blog/906087
  • 主要介绍了Java中调用SQL Server存储过程详解,本文讲解了使用不带参数的存储过程、使用带有输入参数的存储过程、使用带有输出参数的存储过程、使用带有返回状态的存储过程、使用带有更新计数的存储过程等操作实例,...
  • 你肯定有过这样的烦恼,同样的表,不同的数据库,加入你不能执行select insert那么你肯定需要一条这样的存储过程,之需要传入表明,就会给你生成数据的插入语句。当然数据表数量太大,你将最好用别的方式 代码如下...
  • SQLSERVER存储过程例子

    2013-07-22 09:32:48
    SQLSERVER存储过程例子

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 306,848
精华内容 122,739
关键字:

sql存储过程实例