SQL 之存儲過程
阿新 • • 發佈:2017-07-03
ren rod table str where 調用存儲過程 exist cnblogs conf
- 存儲過程
- 是用來執行管理任務或應用復雜的業務規則,
- 存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
- 存儲過程的優點
-
- 存儲過程已在服務器註冊
- 執行速度更快
- 允許模塊化程序設計
- 提高系統安全性 減少網絡流通量
- 系統存儲過程
- 由系統定義,存放在master數據庫中
- 系統存儲過程的名稱都以“sp_”開頭或“xp_”開頭
- 常見的系統存儲過程
exec sp_databases; --查看數據庫 exec sp_tables; --查看表 exec sp_columns student;--查看列 exec sp_helpIndex student;--查看索引 exec sp_helpConstraint student;--約束 exec sp_stored_procedures; exec sp_helptext ‘sp_stored_procedures‘;--查看存儲過程創建、定義語句 exec sp_rename student, stuInfo;--修改表、索引、列的名稱 exec sp_renamedb myTempDB, myDB;--更改數據庫名稱 exec sp_defaultdb ‘master‘, ‘myDB‘;--更改登錄名的默認數據庫 exec sp_helpdb;--數據庫幫助,查詢數據庫信息 exec sp_helpdb master;
- 擴充存儲過程
-
- 可以執行DOS命令下的一些的操作
- 以文本行方式返回任何輸出
- 調用語法: EXEC xp_cmdshell DOS命令 [NO_OUTPUT]
- 啟動方法:
EXEC sp_configure ‘show advanced options‘, 1 GO RECONFIGURE GO EXEC sp_configure ‘xp_cmdshell‘, 1 GO RECONFIGURE GO
- 示例:
/*創建數據庫bankDB,要求保存在D:\bank */ USE master
- 定義存儲過程的語法
CREATE PROC[DEURE] 存儲過程名 @參數1 數據類型 = 默認值 [OUTPUT], @參數2 數據類型 = 默認值 [OUTPUT], ... @參數n 數據類型 = 默認值 [OUTPUT] AS SQL語句 GO
- 調用存儲過程
EXEC 過程名 [參數]
- 用戶自定義存儲過程
- 創建不帶參數存儲過程
--創建存儲過程 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;
- 修改存儲過程
--修改存儲過程 alter proc proc_get_student as select * from student;
- 帶參存儲過程
--帶參存儲過程 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;
- 帶通配符參數存儲過程
--帶通配符參數存儲過程 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%‘;
- 帶輸出參數存儲過程
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;
- 不緩存存儲過程
--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 student; 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 student; 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, 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;--刪除遊標
-
分頁存儲過程
---存儲過程、row_number完成分頁 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;
- 刪除存儲過程
DROP PROC[EDURE] 過程名
SQL 之存儲過程