SQLServer存储过程

存错过程(procedure)--从字面意思上来看,存储过程就是被存储的一种程序、过程

  • 存储过程就是作为可执行对象存放在数据库中的一个或者多个SQL语句
  • 通俗的说,存储过程就是能完成一定操作的SQL语句

存储过程的作用

  • 在创建的时候进行编译,以后不需要重新编译,所以执行速度非常快
  • 可以对一组复杂的操作进行封装,可以重复调用,有点类似我们编程中的方法。
  • 可以设置不同的用户的有没有调用指定存储过程的权限

使用存储过程

创建存储过程基于的表

sql server存储过程作用 sql server存储过程在哪_SQL

Demo 1 最简单的无参数无返回值的存储过程

-- 查询全部的司机的信息
go
create procedure proc_query_Driver
as 
begin
select * from Driver
end
--执行存储过程
exec proc_query_Driver
-- 查询全部的司机的信息
go
create procedure proc_query_Driver
as 
begin
select * from Driver
end
--执行存储过程
exec proc_query_Driver

Demo 2 无返回值有参数的存储过程

--根据名称查找司机信息
create procedure proc_Query_Driver_ByName
@Name varchar(100)
as
begin
    select * from Driver where Name=@Name
end

--执行存储过程
exec proc_Query_Driver_ByName 'DongPeng'
--根据名称查找司机信息
create procedure proc_Query_Driver_ByName
@Name varchar(100)
as
begin
    select * from Driver where Name=@Name
end

--执行存储过程
exec proc_Query_Driver_ByName 'DongPeng'

Demo 3 有返回值无参数的存储过程

--随机返回一条司机记录的Id
create procedure proc_Query_Driver_ByRandom
@Id  varchar(100) output
as 
begin 
    declare @countDriver int
    set @countDriver = (select count(*) from Driver)

    if(@countDriver!=0)
    begin
        --随机取出一条司机的记录,获取该记录的ID
        set @Id= (select top 1 DriverId from Driver order by newid())
    end
    else begin
        --如果没有司机 返回 null
        set @Id = null
    end
end

--执行存储过程
declare @Id varchar(100) 
--执行时需要标明,参数是输出参数
exec proc_query_Driver_ByRandom @id output 
select  @id
--随机返回一条司机记录的Id
create procedure proc_Query_Driver_ByRandom
@Id  varchar(100) output
as 
begin 
    declare @countDriver int
    set @countDriver = (select count(*) from Driver)

    if(@countDriver!=0)
    begin
        --随机取出一条司机的记录,获取该记录的ID
        set @Id= (select top 1 DriverId from Driver order by newid())
    end
    else begin
        --如果没有司机 返回 null
        set @Id = null
    end
end

--执行存储过程
declare @Id varchar(100) 
--执行时需要标明,参数是输出参数
exec proc_query_Driver_ByRandom @id output 
select  @id

Demo4 有参数有返回值的存储过程

--根据性别查询司机的数量
create procedure proc_Query_Count_ByGender
@Gender varchar(10),
@count int output
as  
begin
    set @count=(select  count(*) from Driver where Gender=@Gender)
end

--执行存储过程
declare @count int 
exec proc_Query_Count_ByGender 'M',@count output
select @count
--根据性别查询司机的数量
create procedure proc_Query_Count_ByGender
@Gender varchar(10),
@count int output
as  
begin
    set @count=(select  count(*) from Driver where Gender=@Gender)
end

--执行存储过程
declare @count int 
exec proc_Query_Count_ByGender 'M',@count output
select @count

ADO.Net 调用存储过程

private static string _connectionStr = "server=.;uid=your username;pwd=your password;database=VehicleDB";
//执行 proc_Query_Count_ByGender 存储过程
public static int ExecProcQeruyDriverCount(string gender)
{
    //数据库链接类
    using (SqlConnection conn = new SqlConnection(_connectionStr))
    {
        //打开链接
        conn.Open();
        //数据库命令,传入要执行的存储过程和数据库连接类
        using (SqlCommand cmd = new SqlCommand("proc_Query_Count_ByGender", conn))
        {
            //这是命令的类型
            cmd.CommandType = CommandType.StoredProcedure;
            //传入参数
            cmd.Parameters.Add(new SqlParameter("@Gender", SqlDbType.VarChar)).Value = gender;
            //添加返回参数
            cmd.Parameters.Add(new SqlParameter("@count", SqlDbType.Int)).Direction = ParameterDirection.Output;
            //执行命令
            cmd.ExecuteNonQuery();
            //获取返回参数
            int driverCount = (int)cmd.Parameters["@count"].Value;

            return driverCount;

        }
    }
}

//调用
static void Main(string[] args)
{
    int driverCount = SQLHelper.ExecProcQeruyDriverCount("M");
    Console.WriteLine(driverCount);
    Console.ReadKey();
}

//输出结果为8