sql 存储过程例子和学习demo

--------------------------------------------------------------------------
-------------------------------存储过程Study------------------------------
--------------------------------------------------------------------------
--删除表
drop table student
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--创建用户信息数据表
create table student
(
    id int identity(1,1),--递增1,
    stuNo varchar(50) primary key, --唯一键
    stuName varchar(50),
    stuAge datetime,
    stuSex varchar(5)
)

--创建用户分数数据表
create table course
(
    id int identity(1,1),--递增1,
    stuNo varchar(50),
    courseName varchar(50),
    courseScore decimal
)

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--插入数据
--插入单条数据
insert into student(stuNo,stuName,stuAge,stuSex) values(‘01‘,‘王男‘,‘1996-08-27 09:00:00.000‘,‘男‘)

--多数量插入数据
--SQL Server2008特有的插入
insert into student values(‘02‘,‘杨幂‘,‘1995-4-20 6:0:0‘,‘女‘),
                          (‘03‘,‘程峰‘,‘1988-9-17 15:30:0‘,‘男‘)

insert into course values(‘02‘,‘思想政治‘,‘85.5‘),
                         (‘02‘,‘数学‘,‘70‘),
                         (‘02‘,‘语文‘,‘80‘),
                         (‘02‘,‘物理‘,‘90‘),
                         (‘02‘,‘化学‘,‘65‘),
                         (‘02‘,‘英语‘,‘96‘)

insert into course values(‘03‘,‘思想政治‘,‘60‘),
                         (‘03‘,‘数学‘,‘65‘),
                         (‘03‘,‘语文‘,‘84‘),
                         (‘03‘,‘物理‘,‘70‘),
                         (‘03‘,‘化学‘,‘76‘),
                         (‘03‘,‘英语‘,‘54‘)                         

--使用UNION ALL来进行插入
insert into student
select ‘04‘,‘wangan‘,‘1895-5-27 14:30:28‘,‘女‘
union all
select ‘05‘,‘zhangnan‘,‘1990-1-20 19:0:0‘,‘女‘
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--修改数据
update student set stuSex=‘男‘,stuAge=‘2016-5-9 8:0:0‘ where stuName=‘王男‘
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--删除数据
delete from student where stuNo=01
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程查询所有数据
--begin...end 类似编程语言中的{}
create proc stu1
as
begin
    select * from student;
end
go

exec stu1
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据条件用户名查询用户信息
create proc stu2
@sname varchar(50)   --声明全局变量
as
begin
    select * from student s where [email protected];
end
go

exec stu2 ‘王男‘
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程内部设定用户名查询用户信息
create proc stu3
@sname varchar(50)=‘王男‘
as
begin
    select * from student s where [email protected];
end
go

exec stu3
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户名查询是否存在这个用户信息
create proc stu4
@sname varchar(50),
@result varchar(8) output --输出参数
as
begin
     if (select COUNT(1) from student s where [email protected])>0
     --if exists (select COUNT(1) from student s where [email protected])
     set
        @result=‘存在!‘
     else
     set
        @result=‘不存在!‘
end
go

declare @result varchar(8)
exec stu4 ‘王男1‘,@result output
print @result
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程内部设定局部变量用户名来查询用户信息
create proc stu5
as
declare @sname varchar(50)  --局部变量声明
set @sname=‘杨幂‘
begin
    select * from student s where [email protected]
end
go

exec stu5
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据条件用户学号查询用户名
create proc stu6
@stuNo varchar(50)
as
declare @sname varchar(50)
set @sname=(select s.stuName from student s where [email protected])
select @sname
go

exec stu6 ‘01‘
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程插入用户信息
create proc stu7
@stuNo varchar(50),
@stuName varchar(50),
@stuAge datetime,
@stuSex varchar(5)
as
begin
    insert into student
        (stuNo,stuName,stuAge,stuSex)
    values
        (@stuNo,@stuName,@stuAge,@stuSex)
end
go

exec stu7 ‘07‘,‘王莽‘,‘2000-9-9 9:9:9‘,‘女‘
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户名来删除对应的用户信息
[email protected]@rowcount返回操作条数
--return返回信息,终止下面的操作
create proc stu8
@stuName varchar(50)
as
begin
    delete from student where [email protected]e
    return @@rowcount
end
go

declare @result varchar(50)
exec @result=stu8 ‘王莽‘
select @result as ‘删除条数‘
--print @result
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户学号来查询他的平均分
create proc stu9
@stuNo varchar(50),
@avg int output
as
begin
    set @avg=(select AVG(courseScore) from course where [email protected])
    --等同
    --select @avg=AVG(courseScore) from course where [email protected]
end
go

declare @avg int
exec stu9 ‘02‘,@avg output
print @avg
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户学号来联合查询用户信息和课程信息
create proc stu10
@stuNo varchar(50)
as
    select c.stuNo,s.stuName,s.stuAge,s.stuSex,c.courseName,c.courseScore from student s join course c on s.stuNo=c.stuNo where [email protected]
go

exec stu10 ‘02‘
go

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程判断学号是否存在,不存在,插入用户信息,返回消息;存在,返回信息
create proc stu11
@stuNo varchar(50),
@stuName varchar(50),
@stuAge datetime,
@stuSex varchar(5),
@result varchar(50) output
as
    if exists (select * from student where [email protected])
        begin
            set @result=‘对不起,学号已存在!‘
        end
    else
        begin
            insert into student
                (stuNo,stuName,stuAge,stuSex)
            values
                (@stuNo,@stuName,@stuAge,@stuSex)
            set @result=‘恭喜你,用户信息插入成功!‘
        end
go

declare @result varchar(50)
exec stu11 ‘06‘,‘王忠磊‘,‘1980-8-8 8:9:0‘,‘男‘,@result output
print @result

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程查询当前用户的平均成绩与总的平均成绩之间的关系
create proc stu12
@stuNo varchar(50)
as
declare @curAvg decimal(18,2)
declare @totalAvg decimal(18,2)
if exists(select * from course where [email protected])
    begin
        set @totalAvg=(select AVG(courseScore) from course)
        select @curAvg=AVG(courseScore) from course where [email protected]
        print (‘总的平均分:‘+convert(varchar(18),@totalAvg))
        print (‘该生的平均分:‘+convert(varchar(18),@curAvg))
        if @curAvg>@totalAvg
            print ‘高于平均水平!‘
        else
            print ‘低于平均水平!‘
    end
else
    print ‘该生对应的分数信息不存在,请重新查询!‘
go

exec stu12 ‘03‘
go

一.不含参数的存储过程
1.没有返回值:
创建语句:

CREATE PROCEDURE dbo.ProTest
AS 
    DECLARE @test int
    SET @test = 1

Go

执行SQL语句:

EXEC dbo.ProTest

消息:命令已成功完成。结果:无

2.有返回值(使用select):
创建语句:
CREATE PROCEDURE dbo.ProTest
AS
    DECLARE @test INT;
    SET @test = 123;
    SELECT  @test;

GO

执行SQL语句:

EXEC dbo.ProTest

消息:(1 行受影响)。结果:123(表结构形式)

3.有返回值(使用return)
创建语句:

CREATE PROCEDURE dbo.ProTest

AS
    DECLARE @test INT;
    SET @test = 123;
    RETURN @test;
GO

执行SQL语句:

DECLARE @test INT;
EXEC @test = dbo.ProTest;

SELECT  @test

消息:(1 行受影响)。结果:123(表结构形式)

4.查询一个或多个集合(类似执行select)
创建语句:

CREATE PROCEDURE dbo.ProTest

AS
    SELECT  *
    FROM    dbo.Material_SO_PipeOrder;
GO

执行SQL语句:

EXEC dbo.ProTest

消息:查询出来的条数

结果:查询结果

二.含参数的存储过程
1.没有返回值
创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500) = NULL  --表示可为空参数
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID, OrderNO, OrderName, RMDSC )
            VALUES  ( NEWID(), -- ID - uniqueidentifier
                      @OrderNO, -- OrderNO - nvarchar(50)
                      @OrderName, -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                      );
        END;
GO

执行SQL语句:

EXEC dbo.ProTest @OrderNO = N‘单号001‘, @OrderName = N‘名称001‘, @RMDSC = N‘备注‘

(或不写列名"EXEC  dbo.ProTest  N‘单号001‘, N‘名称001‘, N‘备注‘;",但不能混合使用,下同)

 消息:(1 行受影响)。结果:无

2.有返回值(使用select)
创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500)
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID, OrderNO, OrderName, RMDSC )
            VALUES  ( NEWID(), @OrderNO, -- OrderNO - nvarchar(50)
                      @OrderName, -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                      );
            SELECT 1;
        END;
    ELSE
        SELECT -1;
GO

执行SQL语句:

EXEC  dbo.ProTest @OrderNO = N‘单号001‘, @OrderName = N‘名称001‘, @RMDSC = N‘备注‘;

消息:

(1 行受影响)

(1 行受影响)

结果:1(表结构形式)

3.有返回值(使用return)
创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500)
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID, OrderNO, OrderName, RMDSC )
            VALUES  ( NEWID(), @OrderNO, -- OrderNO - nvarchar(50)
                      @OrderName, -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                      );
            RETURN 1;
        END;
    ELSE
        RETURN -1;
GO

执行SQL语句:

DECLARE @test INT;
EXEC @test = dbo.ProTest @OrderNO = N‘单号001‘, @OrderName = N‘名称001‘, @RMDSC = N‘备注‘;

SELECT @test

消息:

(1 行受影响)

(1 行受影响)

结果:1(表结构形式)

4.带输出参数的存储过程(以没有返回值的为例)
创建语句:

CREATE PROCEDURE dbo.ProTest

    @OrderNO NVARCHAR(50) ,
    @OrderName NVARCHAR(50) ,
    @RMDSC NVARCHAR(500) ,
    @ID UNIQUEIDENTIFIER OUTPUT --输出参数要用output标识
AS
    IF ( @OrderNO IS NOT NULL )
        BEGIN
            DECLARE @newID UNIQUEIDENTIFIER;
            SET @newID = NEWID();
            INSERT  INTO dbo.Material_SO_PipeOrder
                    ( ID ,
                      OrderNO ,
                      OrderName ,
                      RMDSC
                    )
            VALUES  ( @newID ,
                      @OrderNO , -- OrderNO - nvarchar(50)
                      @OrderName , -- OrderName - nvarchar(50)
                      @RMDSC  -- RMDSC - nvarchar(500)
                    );
            SET @ID = @newID;--可以不赋值
        END;
    ELSE
        SET @ID = NULL;--可以不赋值
GO

执行SQL语句:

DECLARE @IDTest UNIQUEIDENTIFIER;
EXEC dbo.ProTest @OrderNO = N‘单号001‘, -- nvarchar(50)
    @OrderName = N‘名称001‘, -- nvarchar(50)
    @RMDSC = N‘备注‘, -- nvarchar(500)
    @ID = @IDTest OUTPUT; --如果不加OUTPUT,select结果为NULL
SELECT  @IDTest;

消息:

(1 行受影响)

(1 行受影响)

结果:EDD11EF3-CD03-4C95-8B79-B3123B34C292(表结构形式)

三.总结与注意:
1.关于存储过程的返回值:

(1).如果有return,则返回return的结果;

(2).如果没有return,则返回INT值0(即使存储过程中有select集合,或Insert受影响行等);

(3).如果带输出参数,则存储过程的返回值同(1),(2);OUTPUT的参数需要select出来;

原文地址:https://www.cnblogs.com/baili-luoyun/p/11056468.html

时间: 2024-10-18 21:53:04

sql 存储过程例子和学习demo的相关文章

一个复杂的SQL存储过程例子

USE [DB_YH_ERP_GW_V2_NewReq] GO /****** Object:  StoredProcedure [dbo].[sp_FactoryAllocationFind]    Script Date: 05/09/2016 08:45:52 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author:

sql存储过程几个简单例子

导读:sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解. 例1: create proc proc_stu @sname varchar(20), @pwd varchar(20) as select * from ren where [email protected] and [email protected] go 查看结果:proc_stu 'admin','a

SQL存储过程和函数

SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定义:存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.和函数的区别在于,函数有返回值,存储过程没有. 优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度.2.当对数据库进行复杂操作时,

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

sql存储过程和事务的应用

在去年,学习数据库的时候就学过存储过程了.一直都只知道一些理论,却不知道如何去使用.时隔一年,终于找到如何使用存储过程了. 在机房收费系统中,有些操作,需要多次执行sql语句,多次执行完成才算是完成这个事件流.但是如果其中有一个环节出了错误,那么没出错误的那些操作是不是就多余了. 执行存储过程,就是执行多句SQl语句.而事务,是为了控制这些语句 要么都做,要么 都不做. 在机房收费系统中,执行sql语句的时候. 一般的sql语句使用方法:定义一个字符串,用于存放sql语句.之后指明command

CABasicAnimation学习Demo 包括了一些常用的动画效果

个人写的一些例子: // // ViewController.m // CABasicAnimationDemo // // Created by haotian on 14-6-13. // Copyright (c) 2014年 Baseus. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @syn

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了.我们要判断,任意一张表插入失败都回滚,就是都不插入,这就是事务的基本使用. 一,sql事务定义 所谓事务是用户定义的一个数据库操作序列,是一个不可分割的工作

sql全文检索例子

sql 中contains的使用例子,参数详解 全文索引——CONTAINS 语法 我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents'). 我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列. 1. 查询住址在北京的学生 SELECT student_id,student_name FROM stu

PL/SQL存储过程编程

/**author huangchaobiao *Email:[email protected] */ PL/SQL存储过程编程(上) 1. Oracle应用编辑方法概览 答:1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和数据库打交道的方法,和ProC很相似,更底层,很少用; 4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据内运行, 其他