zoukankan      html  css  js  c++  java
  • sql 存储过程

      1 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 
      2 
      3 Ø 存储过程的概念 
      4 
      5     存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 
      6 
      7     存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 
      8 
      9     由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 
     10 
     11   
     12 
     13     1、 存储过程的优点 
     14 
     15         A、 存储过程允许标准组件式编程 
     16 
     17         存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 
     18 
     19         B、 存储过程能够实现较快的执行速度 
     20 
     21         如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 
     22 
     23         C、 存储过程减轻网络流量 
     24 
     25         对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 
     26 
     27         D、 存储过程可被作为一种安全机制来充分利用 
     28 
     29         系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。 
     30 
     31   
     32 
     33 Ø 系统存储过程 
     34 
     35     系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。 
     36 
     37     常用系统存储过程有: 
     38 
     39 exec sp_databases; --查看数据库
     40 exec sp_tables;        --查看表
     41 exec sp_columns student;--查看列
     42 exec sp_helpIndex student;--查看索引
     43 exec sp_helpConstraint student;--约束
     44 exec sp_stored_procedures;
     45 exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
     46 exec sp_rename student, stuInfo;--修改表、索引、列的名称
     47 exec sp_renamedb myTempDB, myDB;--更改数据库名称
     48 exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
     49 exec sp_helpdb;--数据库帮助,查询数据库信息
     50 exec sp_helpdb master;
     51 
     52 
     53     系统存储过程示例: 
     54 
     55 --表重命名
     56 exec sp_rename 'stu', 'stud';
     57 select * from stud;
     58 --列重命名
     59 exec sp_rename 'stud.name', 'sName', 'column';
     60 exec sp_help 'stud';
     61 --重命名索引
     62 exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
     63 exec sp_help 'student';
     64 
     65 --查询所有存储过程
     66 select * from sys.objects where type = 'P';
     67 select * from sys.objects where type_desc like '%pro%' and name like 'sp%';
     68 
     69   
     70 
     71 Ø 用户自定义存储过程 
     72 
     73    1、 创建语法 
     74 
     75 create proc | procedure pro_name
     76     [{@参数数据类型} [=默认值] [output],
     77      {@参数数据类型} [=默认值] [output],
     78      ....
     79     ]
     80 as
     81     SQL_statements
     82 
     83   
     84 
     85    2、 创建不带参数存储过程 
     86 
     87 --创建存储过程
     88 if (exists (select * from sys.objects where name = 'proc_get_student'))
     89     drop proc proc_get_student
     90 go
     91 create proc proc_get_student
     92 as
     93     select * from student;
     94 
     95 --调用、执行存储过程
     96 exec proc_get_student;
     97 
     98 
     99    3、 修改存储过程 
    100 
    101 --修改存储过程
    102 alter proc proc_get_student
    103 as
    104 select * from student;
    105 
    106 
    107    4、 带参存储过程 
    108 
    109 --带参存储过程
    110 if (object_id('proc_find_stu', 'P') is not null)
    111     drop proc proc_find_stu
    112 go
    113 create proc proc_find_stu(@startId int, @endId int)
    114 as
    115     select * from student where id between @startId and @endId
    116 go
    117 
    118 exec proc_find_stu 2, 4;
    119 
    120 
    121    5、 带通配符参数存储过程 
    122 
    123 --带通配符参数存储过程
    124 if (object_id('proc_findStudentByName', 'P') is not null)
    125     drop proc proc_findStudentByName
    126 go
    127 create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
    128 as
    129     select * from student where name like @name and name like @nextName;
    130 go
    131 
    132 exec proc_findStudentByName;
    133 exec proc_findStudentByName '%o%', 't%';
    134 
    135 
    136    6、 带输出参数存储过程 
    137 
    138 if (object_id('proc_getStudentRecord', 'P') is not null)
    139     drop proc proc_getStudentRecord
    140 go
    141 create proc proc_getStudentRecord(
    142     @id int, --默认输入参数
    143     @name varchar(20) out, --输出参数
    144     @age varchar(20) output--输入输出参数
    145 )
    146 as
    147     select @name = name, @age = age  from student where id = @id and sex = @age;
    148 go
    149 
    150 -- 
    151 declare @id int,
    152         @name varchar(20),
    153         @temp varchar(20);
    154 set @id = 7; 
    155 set @temp = 1;
    156 exec proc_getStudentRecord @id, @name out, @temp output;
    157 select @name, @temp;
    158 print @name + '#' + @temp;
    159 
    160 
    161 
    162 
    163 
    164    7、 不缓存存储过程 
    165 
    166 --WITH RECOMPILE 不缓存
    167 if (object_id('proc_temp', 'P') is not null)
    168     drop proc proc_temp
    169 go
    170 create proc proc_temp
    171 with recompile
    172 as
    173     select * from student;
    174 go
    175 
    176 exec proc_temp;
    177 
    178 
    179    8、 加密存储过程 
    180 
    181 --加密WITH ENCRYPTION 
    182 if (object_id('proc_temp_encryption', 'P') is not null)
    183     drop proc proc_temp_encryption
    184 go
    185 create proc proc_temp_encryption
    186 with encryption
    187 as
    188     select * from student;
    189 go
    190 
    191 exec proc_temp_encryption;
    192 exec sp_helptext 'proc_temp';
    193 exec sp_helptext 'proc_temp_encryption';
    194 
    195 
    196    9、 带游标参数存储过程 
    197 
    198 if (object_id('proc_cursor', 'P') is not null)
    199     drop proc proc_cursor
    200 go
    201 create proc proc_cursor
    202     @cur cursor varying output
    203 as
    204     set @cur = cursor forward_only static for
    205     select id, name, age from student;
    206     open @cur;
    207 go
    208 --调用
    209 declare @exec_cur cursor;
    210 declare @id int,
    211         @name varchar(20),
    212         @age int;
    213 exec proc_cursor @cur = @exec_cur output;--调用存储过程
    214 fetch next from @exec_cur into @id, @name, @age;
    215 while (@@fetch_status = 0)
    216 begin
    217     fetch next from @exec_cur into @id, @name, @age;
    218     print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age);
    219 end
    220 close @exec_cur;
    221 deallocate @exec_cur;--删除游标
    222 
    223 
    224 
    225 
    226 
    227    10、 分页存储过程 
    228 
    229 ---存储过程、row_number完成分页
    230 if (object_id('pro_page', 'P') is not null)
    231     drop proc proc_cursor
    232 go
    233 create proc pro_page
    234     @startIndex int,
    235     @endIndex int
    236 as
    237     select count(*) from product
    238 ;    
    239     select * from (
    240         select row_number() over(order by pid) as rowId, * from product 
    241     ) temp
    242     where temp.rowId between @startIndex and @endIndex
    243 go
    244 --drop proc pro_page
    245 exec pro_page 1, 4
    246 --
    247 --分页存储过程
    248 if (object_id('pro_page', 'P') is not null)
    249     drop proc pro_stu
    250 go
    251 create procedure pro_stu(
    252     @pageIndex int,
    253     @pageSize int
    254 )
    255 as
    256     declare @startRow int, @endRow int
    257     set @startRow = (@pageIndex - 1) * @pageSize +1
    258     set @endRow = @startRow + @pageSize -1
    259     select * from (
    260         select *, row_number() over (order by id asc) as number from student 
    261     ) t
    262     where t.number between @startRow and @endRow;
    263 
    264 exec pro_stu 2, 2;
    265 
    266 
    267 
    268 
    269 
    270 
    271 Ø Raiserror 
    272 
    273 Raiserror返回用户定义的错误信息,可以指定严重级别,设置系统变量记录所发生的错误。 
    274 
    275    语法如下: 
    276 
    277 Raiserror({msg_id | msg_str | @local_variable}
    278   {, severity, state}
    279   [,argument[,…n]]
    280   [with option[,…n]]
    281 )
    282 
    283 
    284    # msg_id:在sysmessages系统表中指定的用户定义错误信息 
    285 
    286    # msg_str:用户定义的信息,信息最大长度在2047个字符。 
    287 
    288    # severity:用户定义与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。 
    289 
    290     任何用户可以指定0-18直接的严重级别。只有sysadmin固定服务器角色常用或具有alter trace权限的用户才能指定19-25直接的严重级别。19-25之间的安全级别需要使用with log选项。 
    291 
    292    # state:介于1至127直接的任何整数。State默认值是1。 
    293 
    294 raiserror('is error', 16, 1);
    295 select * from sys.messages;
    296 --使用sysmessages中定义的消息
    297 raiserror(33003, 16, 1);
    298 raiserror(33006, 16, 1);
  • 相关阅读:
    ethtool 命令输出的注意点--网卡参数
    centos7.2+zabbix3.2+sedmail邮件告警
    vscode monokai
    SQL SERVER 常用命令
    数据库问题6-將系統資料表對應至系統檢視
    数据库问题5-SYS.SYSPROCESSES使用和查找死锁
    select * from sys.sysprocesses
    【SQL Server学习笔记】事务、锁定、阻塞、死锁 sys.sysprocesses
    使用DMV调优性能 --Burgess_Liu
    sql server线程等待信息
  • 原文地址:https://www.cnblogs.com/yangpeng-jingjing/p/4710733.html
Copyright © 2011-2022 走看看