SQLserver存储过程

本文详细介绍了 SQL Server 中的存储过程使用方法,包括系统常用存储过程、自定义存储过程的创建、执行、修改及删除等操作。还介绍了如何使用参数、输出参数、游标参数以及存储过程加密等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLserver存储过程

系统常用的存储过程

exec sp_databases; --查看数据库
exec sp_tables;        --查看表
exec sp_columns column;--查看列
exec sp_helpIndex table;--查看索引
exec sp_helpConstraint table;--约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
exec sp_rename '*name', '*name';--修改表、索引、列的名称
exec sp_renamedb 'dbname', 'dbname';--更改数据库名称
exec sp_defaultdb 'dbname', 'dbname';--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;

系统存储过程实例

--将表Students重命名为StdtInfo
exec sp_rename 'Students','StdtInfo';

--将列重命名
exec sp_rename 'Name','SName','column';

自定义存储过程

create proc | procedure pro_name
    [{@参数数据类型} [=默认值] [output],
     {@参数数据类型} [=默认值] [output],
     ....
    ]
as
    SQL_statements
创建不带参数的存储过程
--删除存储过程
DROP PROCEDURE proc_GetStudent;
GO
--创建带参存储过程
CREATE PROCEDURE proc_GetStudent
    AS 
    BEGIN
        SELECT * FROM Students
    END
GO
--执行存储过程
EXECUTE proc_GetStudent
GO
修改存储过程
--修改存储过程
ALTER PROCEDURE proc_GetStudent
    AS
    BEGIN
        SELECT * FROM Students
    END
GO
带参存储过程
--删除存储过程
DROP PROCEDURE proc_GetStudent;
GO
--创建带参存储过程
CREATE PROCEDURE proc_GetStudent (@StartID INT,@EndID INT)
    AS 
    BEGIN
        SELECT * FROM Students WHERE ID BETWEEN @StartID AND @EndID
    END
GO
--执行存储过程
EXECUTE proc_GetStudent 10,20
GO
--修改存储过程
ALTER PROCEDURE proc_GetStudent (@StartID INT,@EndID INT)
    AS
    BEGIN
        SELECT * FROM Students WHERE ID NOT BETWEEN @StartID AND @EndID
    END
GO
带通配符参数存储过程
--带通配符参数存储过程
IF OBJECT_ID('proc_GetStudentsBYNameSelect','P') IS NOT NULL
BEGIN
    DROP PROCEDURE proc_GetStudentsBYNameSelect
END
GO
CREATE PROCEDURE proc_GetStudentsBYNameSelect (@Name NVARCHAR(20)='%雷%')
AS
    BEGIN
        SELECT * FROM Students WHERE Name LIKE @Name
    END
GO
EXECUTE proc_GetStudentsBYNameSelect
EXECUTE proc_GetStudentsBYNameSelect '%毕%'
带输出参数存储过程
--带输出参数的存储过程
IF OBJECT_ID('proc_GetStudentRecord','P') IS NOT NULL
BEGIN
    DROP PROCEDURE proc_GetStudentRecord
END
GO
CREATE PROCEDURE proc_GetStudentRecord (@ID INT,@name NVARCHAR(20) OUT,@gender NVARCHAR(20) OUT)
AS
    BEGIN
        SELECT @name=Name,@gender=Gender FROM Students WHERE ID=@ID
        PRINT @name+'  '+@gender
    END
GO

EXECUTE proc_GetStudentRecord 21,'',''
不缓存存储过程
--WITH RECOMPILE 不缓存的存储过程
IF(OBJECT_ID('proc_Temp','P')) IS NOT NULL
BEGIN
    DROP PROCEDURE proc_Temp
END
GO
CREATE PROCEDURE proc_Temp
WITH RECOMPILE  --不缓存
AS
    BEGIN
        SELECT * FROM Students
    END
GO
EXECUTE proc_Temp
GO
加密存储过程
IF (OBJECT_ID('proc_TempEncryption','P')) IS NOT NULL
BEGIN
    DROP PROCEDURE proc_TempEncryption
END
GO
CREATE PROCEDURE proc_TempEncryption
WITH ENCRYPTION
AS
    BEGIN
        SELECT * FROM Students
    END
GO
EXECUTE proc_TempEncryption
EXECUTE sp_helptext proc_TempEncryption
--结果:对象 'proc_TempEncryption' 的文本已加密。
EXECUTE sp_helptext proc_Temp
带游标参数存储过程
--带游标参数存储过程
IF (OBJECT_ID('proc_Cursor','P')) IS NOT NULL
BEGIN
    DROP PROCEDURE proc_Cursor
END
GO
CREATE PROCEDURE proc_Cursor (@cursor CURSOR VARYING OUTPUT)
AS
    BEGIN
        SET @cursor=cursor FORWARD_ONLY STATIC FOR
        SELECT ID,Name,Gender FROM Students
        OPEN @cursor
    END
GO
--调用
DECLARE @exec_cursor CURSOR
DECLARE @ID INT,@Name NVARCHAR(20),@Gender NVARCHAR(20)
EXECUTE proc_Cursor @cursor=@exec_cursor OUTPUT
FETCH NEXT FROM @exec_cursor INTO @ID,@Name,@Gender
WHILE(@@FETCH_STATUS=0)
BEGIN
    PRINT 'ID:'+CONVERT(NVARCHAR(20),@ID)+',Name:'+@Name+',Gender:'+@Gender
    FETCH NEXT FROM @exec_cursor INTO @ID,@Name,@Gender
END
CLOSE @exec_cursor
DEALLOCATE @exec_cursor
---创建数据库 create database CRM; --删除数据库 drop database CRM; --创建一个表 if exists(select * from sysobjects where name='Users') drop table Users go create table Users( Id int identity(1,1) not null primary key, --顾客编号,主键 按一进行自动增长 UserName varchar(50)not null, PassWord varchar(50)not null, Address varchar(250)not null, ) go ----------------------------------------插入100条数据进Users表,进行下面对分页做准备---------------- Begin Declare @n bigint Declare @Sql nvarchar(225) set @n=0 While @n<100--导入100条相同的数据进Users表 Begin Set @Sql='Insert into Users Values(''jilongliang'',''123456'',''广东阳春'')' Exec (@Sql) set @n=@n+1 End End ------------查询一下是不是插入--------------- Select *from Users; -------------------------存储过程创建语法----------------------------------- /* 1.存储过程创建语法 create proc | procedure pro_name [{@参数数据类型} [=默认值] [output], {@参数数据类型} [=默认值] [output], .... ] as SQL_statements */ --------------------------------------------------------------------------------- -------------------------- 带参存储过程----------------------------------- if (object_id('proc_find_users', 'P') is not null) drop proc proc_find_users go create proc proc_find_users(@startId int, @endId int) as ---between and 表示在那个两个数字之间 select * from users where Id between @startId and @endId go exec proc_find_users 42, 64; --------------------------------------------------------------------------------- --------------------------------带通配符参数存储过程----------------------------- if (object_id('proc_findUsersByName', 'P') is not null) drop proc proc_findUsersByName go create proc proc_findUsersByName(@UserName varchar(20) = '%j%', @nextName varchar(20) = '%') as select * from Users where UserName like @UserName and UserName like @nextName; go exec proc_findUsersByName; exec proc_findUsersByName '%l%', 'j%'; --------------------------------------------------------------------------------------- ----------------------------------------带输出参数存储过程--------------------------------------- if (object_id('proc_getUsersRecord', 'P') is not null) drop proc proc_getUsersRecord go create proc proc_getUsersRecord( @Id int, --默认输入参数 @UserName varchar(20) out, --输出参数 @address varchar(20) output --输入输出参数 ) as select @UserName = UserName, @address = address from Users where Id = @Id and Address = @address; go ---------------声明变量 declare @id int, @address varchar(20), @UserName varchar(20), @temp varchar(20); set @id = 71; set @temp = 1; exec proc_getUsersRecord @id, @UserName out, @temp output; select @UserName as 用户名, @temp as temp,@address as 地址; print @UserName + '#' + @temp; --------------------------------------------------------------------------------------- -----------------------------------不缓存存储过程--------------------------------------- --WITH RECOMPILE 不缓存 if (object_id('proc_temp', 'P') is not null) drop proc proc_temp go create proc proc_temp with recompile as select * from users; go exec proc_temp; -----------------------------------加密存储过程------------------------------------- --加密WITH ENCRYPTION 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 users; go exec proc_temp_encryption; exec sp_helptext 'proc_temp'; exec sp_helptext 'proc_temp_encryption'; -----------------------------------带游标参数存储过程------------------------------------- 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, UserName, Address from Users; open @cur; go --调用 declare @exec_cur cursor; declare @Id int, @UserName varchar(50), @Address varchar(250); exec proc_cursor @cur = @exec_cur output;--调用存储过程 fetch next from @exec_cur into @Id, @UserName, @Address; while (@@fetch_status = 0) begin fetch next from @exec_cur into @Id, @UserName, @Address; print 'Id: ' + convert(varchar, @Id) + ', name: ' + @UserName + ', Address: ' + @Address; end close @exec_cur; deallocate @exec_cur;--删除游标 ---------------------------------------------------------- select * from sys.messages; --使用sysmessages中定义的消息 --------------------------------Query--------------------- Create PROCEDURE proc_LoginUser @userName varchar(50), @password varchar(50) as begin select UserName,PassWord from Users where UserName = @userName and PassWord = @PassWord end GO --这个Go注意不要放在Exec后面,否则报超出了存储过程、函数、 --触发器或视图的最大嵌套层数(最大层数为 32) exec proc_LoginUser @userName = 'admin',@PassWord = 'admin' --------------------------------Insert--------------------- Create proc proc_InsertUsers @UserName varchar(50), @PassWord varchar(50), @Address varchar(150) as insert into proc_InsertUsers values(@UserName,@PassWord,@Address) --------------------------------Update--------------------- --修改模块信息,根据模块Id Create proc proc_UpdateUser @UserName varchar(50), @PassWord varchar(50), @Address varchar(150), @Id int as update Users set UserName=@UserName,PassWord=@PassWord ,Address=@Address where Id = @Id --------------------------------Delete--------------------- Create proc proc_DeleteById @Id int as delete from Users where Id=@Id ----------------------------------------------------------- ------------------------------------------------------------------------------------- ----------------------------------分页存储过程-------------------------------------- ------------------------------------------------------------------------------------- If (object_id('pro_page', 'P') is not null) drop proc proc_Page GO create procedure proc_Page( @pageIndex int, @pageSize int ) as declare @startRow int, @endRow int --声明变量 set @startRow = (@pageIndex - 1) * @pageSize +1 --设值 set @endRow = @startRow + @pageSize -1 --设值 select ID,UserName,Address,PassWord,t.number from --t.number的行号 ( select ID,UserName,Address,PassWord, row_number() over (order by id asc) as number from Users ) t where t.number between @startRow and @endRow; GO ----执行 exec proc_Page 1, 3; -- 一页,三条数据 ------------------------------------------------------------------------------------- ---存储过程、row_number完成分页 if (object_id('pro_page', 'P') is not null) drop proc proc_cursor -- drop proc pro_page go create proc pro_Page @startIndex int, @endIndex int as select count(*) as Total from Users; --计算出来总数 select * from ( select row_number() over(order by Id) as rowId, * from Users ) temp where temp.rowId between @startIndex and @endIndex go exec pro_Page 1, 4 ------------------------------------------------------------------------------------- -------------------------------------数据库的函数-------------------------------------- exec sp_databases; --查看数据库 exec sp_tables; --查看表 exec sp_columns users;--查看列 exec sp_helpIndex users;--查看索引 exec sp_helpConstraint users;--约束 exec sp_stored_procedures; exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句 exec sp_rename users, stuInfo;--修改表、索引、列的名称 exec sp_renamedb myTempDB, myDB;--更改数据库名称 exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库 exec sp_helpdb;--数据库帮助,查询数据库信息 exec sp_helpdb master; ------------------------------------------------------------------------------------- ---------------------------数据库的sp_rename重命名函数------------------------------- --表重命名 exec sp_rename 'users', 'tb_users'; select * from tb_users; --列重命名 exec sp_rename 'tb_users.name', 'sName', 'column'; exec sp_help 'tb_users'; --重命名索引 exec sp_rename N'tb_users.idx_cid', N'idx_cidd', N'index'; exec sp_help 'tb_users'; --查询所有存储过程 select * from sys.objects where type = 'P'; select * from sys.objects where type_desc like '%pro%' and name like 'sp%';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值