SQL之PROCEDURE(存储过程)

2025-11-29 16:24:39

SQL之PROCEDURE(存储过程)的使用方法

1、 创建语法

create proc | procedure pro_name

   [{@参数数据类型} [=默认值] [output],

    {@参数数据类型} [=默认值] [output],

    ....

   ]

as

   SQL_statements

2、 创建不带参数存储过程

if (exists (select * from sys.objects where name = 'proc_get_student'))

    drop proc proc_get_student

go

create proc proc_get_student

as

    select * from student;

--调用、执行存储过程

exec proc_get_student;

3、 修改存储过程

alter proc proc_get_student

as 

select * from student;

4、 带参存储过程

if (object_id('proc_find_stu', 'P') is not null)

    drop proc proc_find_stu

go

create proc proc_find_stu(@startId int, @endId int)

as

    select * from student where id between @startId and @endId

go

exec proc_find_stu 2, 4;

5、 带通配符参数存储过程

if (object_id('proc_findStudentByName', 'P') is not null)

    drop proc proc_findStudentByName

go

create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')

as

    select * from student where name like @name and name like @nextName;

go

exec proc_findStudentByName;

exec proc_findStudentByName '%o%', 't%';

6、 带输出参数存储过程

if (object_id('proc_getStudentRecord', 'P') is not null)

    drop proc proc_getStudentRecord

go

create proc proc_getStudentRecord(

    @id int, --默认输入参数

    @name varchar(20) out, --输出参数

    @age varchar(20) output--输入输出参数

)

as

    select @name = name, @age = age  from student where id = @id and sex = @age;

go

-- 

declare @id int,

        @name varchar(20),

        @temp varchar(20);

set @id = 7; 

set @temp = 1;

exec proc_getStudentRecord @id, @name out, @temp output;

select @name, @temp;

print @name + '#' + @temp;

7、 不缓存存储过程

if (object_id('proc_temp', 'P') is not null)

    drop proc proc_temp

go

create proc proc_temp

with recompile

as

    select * from student;

go

exec proc_temp;

8、 加密存储过程

if (object_id('proc_temp_encryption', 'P') is not null)

    drop proc proc_temp_encryption

go

create proc proc_temp_encryption

with encryption

as

    select * from student;

go

exec proc_temp_encryption;

exec sp_helptext 'proc_temp';

exec sp_helptext 'proc_temp_encryption';

9、 带游标参数存储过程

if (object_id('proc_cursor', 'P') is not null)

    drop proc proc_cursor

go

create proc proc_cursor

    @cur cursor varying output

as

    set @cur = cursor forward_only static for

    select id, name, age from student;

    open @cur;

go

--调用

declare @exec_cur cursor;

declare @id int,

        @name varchar(20),

        @age int;

exec proc_cursor @cur = @exec_cur output;--调用存储过程

fetch next from @exec_cur into @id, @name, @age;

while (@@fetch_status = 0)

begin

    fetch next from @exec_cur into @id, @name, @age;

    print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age);

end

close @exec_cur;

deallocate @exec_cur;--删除游标

10、 分页存储过程

if (object_id('pro_page', 'P') is not null)

    drop proc proc_cursor

go

create proc pro_page

    @startIndex int,

    @endIndex int

as

    select count(*) from product

;    

    select * from (

        select row_number() over(order by pid) as rowId, * from product 

    ) temp

    where temp.rowId between @startIndex and @endIndex

go

--drop proc pro_page

exec pro_page 1, 4

--

--分页存储过程

if (object_id('pro_page', 'P') is not null)

    drop proc pro_stu

go

create procedure pro_stu(

    @pageIndex int,

    @pageSize int

)

as

    declare @startRow int, @endRow int

    set @startRow = (@pageIndex - 1) * @pageSize +1

    set @endRow = @startRow + @pageSize -1

    select * from (

        select *, row_number() over (order by id asc) as number from student 

    ) t

    where t.number between @startRow and @endRow;

exec pro_stu 2, 2;

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢