SQL——存储过程

原文:SQL——存储过程

1. 为什么使用存储过程

     应用程序通过T-SQL语句到服务器的过程是不安全的。

     1) 数据不安全

      2)每次提交SQL代码都要经过语法编译后在执行,影响应用程序的运行性能

      3) 网络流量大

 

2. 什么是存储过程

        存储过程是SQL语句和控制语句的预编译集合,保存在数据库里,可由应用程序调用执行,而且允许用户声明变量、逻辑控制语句及其他强大的编程功能。保存在SQLServer中,通过名称和参数执行,也可一返回结果。对于存储过程我更倾向于把他理解成方法。它里面可以只有一条查询语句,也可以包含一系列使用控制流的SQL语句。

 

3. 存储过程的优点

     1) 模块化呈现设计

     2) 执行速度快,效率高

     3) 减少网络流量

     4) 具有良好的安全性

4. 存储过程的分类

      1)系统存储过程

      2)扩展存储过程(属于系统存储过程的一种)

      3)用户自定义存储过程

 

5. 系统存储过程

      它一般以"sp_"开头,是由SQL Server创建、管理和使用,它存放在Resource数据库中。类似C#语言类库中的方法,暂时先不考虑它是如何编写的,先了解常用的系统存储过程及调用方法。

     常见的系统存储过程,见下一篇文章

     调用方法:exec[ute]  存储过程名  [参数值]

 

6.  常用的扩展存储过程   xp_cmdshell

     xp_cmdshell  它可以完成DOS命令下的一些操作。

     exec  xp_cmdshell  DOS命令  [no_output]

     说明  no_output是可选参数,表示设置执行DOS命令后是否输出返回信息。

     示例: exec xp_cmdshell  'mkdir  D:\newdir'  output

     强调: 因为用户可以通过xp_cmdshell对操作系统做一些操作,如果该存储过程被黑客使用对操作系统做操作就麻烦了,所以通常会把xp_cmdshell 关闭掉:

     方法一: 

     SQL Server 2008版本及以上, 通过数据库右击  选择“方面”   ,在下拉列表中选择 “服务器安全‘ , 下面的列表项中可以看到xmcmdshellEnable 设置。

     SQL Server2005版本及以下,通过开始- SQLServer- 外围设备查找

     方法二:

    关闭xp_cmdshell

    EXEC sp_configure 'show advanced options', 1;

    RECONFIGURE;

    EXEC sp_configure 'xp_cmdshell', 1;

    RECONFIGURE;

    开启xp_cmdshell

    EXEC sp_configure 'show advanced options', 1;

    RECONFIGURE;

    EXEC sp_configure 'xp_cmdshell', 0;

     RECONFIGURE;

 

7. 用户自定义存储过程

   语法:

   create  proc[edure] 存储过程名

            @参数1  数据类型 = 默认值 output, 

            ……

            @参数n  数据类型 = 默认值 output

  as  

              <SQL 语句>

  go

 

 一个完成的存储过程包含以下3部分:

   1) 输入参数、输出参数

   2) 在存储过程中执行的T-SQL语句

   3) 存储过程的返回值

其中输入参数允许有默认值。

    删除存储过程

    drop proc  存储过程名

    if  exists (select * from sysobject where name = 存储过程名)

             drop proc  存储过程名

    go

 

8.  注意事项

       存储过程的声明: 输入参数可以有默认值,输出参数也可以有默认值

      create proc  usp_name

                  @age int = 5,

       @name varchar(10)        

       as 

           ……

       go

        执行语句:  

           exec  pr_name  18 , 'zm'

            exec  default  , 'zm'

            exec  @name = 'zm'

       说明: 为了调用方便,最好将有默认值的存储过程参数列表放到最后。

 

       带输出参数的存储过程

       create proc usp_name

               @num1  int,

               @sum int output

       as

             <SQL语句>

       go 

     调用存储过程 

      declare @sum int 

      exec  usp_name  5, @sum  output

      注意, 调用带有输出参数的存储过程参数后面必须带output关键字

 

9. 处理存储过程中的错误

    raiserror  ( {msg_id  | msg_str} {, serverity, state } [with option [,……]])

    其中:

    msg_id: 在sysmessage系统表中指定用户定义错误信息

    msg_str: 用户定义的特定信息,最长为255个字符

    serverity: 与特定信息相关联,表示用户定义的严重性级别。用户可选用的级别是0~18。数字越大,表示越严重。

     state : 表示错误的状态, 1~255中的值

     option: 错误的自定义选项,可以使一下任意一值

    LOG: 在Microsoft SQl Server 数据库引擎示例的错误日志和应用程序日志中记录错误

          NOWAIT:将消息立即发送给客户端

       SETERROR:将@@error值和 ERROR_NUMBER 值设置为msg_id 或5000, 不用考虑严重级别。

          例如: raiserror ('错误信息', 16,1)

时间: 2024-10-18 13:13:24

SQL——存储过程的相关文章

sql-关于单表SQL存储过程查询。分页条数,当前页码,总条数的问题

问题描述 关于单表SQL存储过程查询.分页条数,当前页码,总条数的问题 我实现PUB_AREA 表的数据查询, 上面是我写的调试, 指出在下面and处报错,无布尔类型,不知道到底哪里错了- - declare @TotalNum intexec PUB_AREA_SelectAREACITYByHsfSearchss ''101@TotalNum outputselect @TotalNumalter PROCEDURE [dbo].[PUB_AREA_SelectAREACITYByHsfSe

使用SQL存储过程要特别注意的问题-注意顺序读取

存储过程|问题     存储过程是一个运行于SQL数据库之中最核心的事务,它通过长驻内存的形式,进行读取\处理\写入最为频繁处理的数据.     ASP虽然在微软的ASPX的侵袭下,仍旧是中小企业继续在用的一种网页语言,但是当要读取海量数据的时候,如果仍旧使用普通的SQL进行读取运行与写入,将导致系统资源的严重浪费,所以我们在ASP中使用存储过程,以提高数据的存取速度,同时通过SQL核心的获取数据的方法,可以有效的减少垃圾数据(不被立即使用,而且也不备较短的时间里被使用的数据)操作.     在

ASP.Net学习之常用SQL存储过程

asp.net|存储过程 在ASP.Net项目中使用存储过程,首先可以提高数据库的安全性,其次可以提高运行SQL代码运行的速度,在大型项目中一般是必不可少的.Visual Studio.Net为SQL的存储过程提供了强大的支持,您既可以通过visual studio.net来新建存储过程,也可以直接在Sql Server的查询分析器中运行,还可以通过企业管理器创建,使用起来也非常方便.大家一直都误认为SQL存储过程是一个比较"高深"的技术,其实掌握一般的语法是没有什么大问题的,而我们在

SQL存储过程学习

一.SQL存储过程的概念,优点及语法 整理在学习程序过程之前,先了解下什么是存储过程?为什么要用存储过程,他有那些优点 定义:将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令. 讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊? Microsoft公司为什么还要添加这个技术呢? 那么存储过程与一般的SQL语句有什么区别呢? 存储过程的优点: 1.存储过程只

测试运行: 使用LINQ测试SQL存储过程

对访问和操作后端 SQL Server 数据库的程序进行测试十分常见.在此类情况中,应用程序基本都是通过使用 SQL 存储过程来与后端数据进行交互的.此时,可将存储过程看作待测试系统的辅助方法:因此也必须像系统中的任何其他模块一样测试它们. 尽管在测试 SQL 存储过程时可使用的方法有很多,但我发现使用 LINQ 可极大地简化测试自动化.在本月的专栏中,我将向您展示如何使用 LINQ(尤其是使用 LINQ to SQL 提供程序)来测试 SQL 存储过程.我将假定您的 C# 和 SQL 技能属于

sql-关于SQL存储过程的一个问题。

问题描述 关于SQL存储过程的一个问题. declare @TotalNum int exec PUB_AREA_SelectAREACITYByHsfSearchss '',10,1,@TotalNum output select @TotalNum alter PROCEDURE [dbo].[PUB_AREA_SelectAREACITYByHsfSearchss] @HsfSearch VARCHAR(2000), --刷选条件 @PageSize INT, --分页条数 @CurPag

asp.net sql存储过程_实用技巧

Visual Studio.Net为SQL的存储过程提供了强大的支持,您既可以通过visual studio.net来新建存储过程,也可以直接在Sql Server的查询分析器中运行,还可以通过企业管理器创建,使用起来也非常方便.大家一直都误认为SQL存储过程是一个比较"高深"的技术,其实掌握一般的语法是没有什么大问题的,而我们在使用存储教程中也主要是增删减的操作,学会使用一般的T-SQL就很容易上手了. 我们先来看一下在Sql-server中是如何创建一个存储过程的吧,我们可以使用S

sqlserver 存储过程-关于SQL存储过程使用游标循环的问题

问题描述 关于SQL存储过程使用游标循环的问题 现有三张表a.b.c,循环表a,把a 表的某个字段作为b表的查询条件,如果b表查出的数据满足某个条件,就往c表里插一条数据,怎么写个存储过程?

数据-sql存储过程的问题,拆分并加值

问题描述 sql存储过程的问题,拆分并加值 传入'1,2,3'怎么拆分并分别加入到表里面 (三条数据) 解决方案 create function func_splitstring (@str nvarchar(max),@split varchar(10)) returns @t Table (c1 varchar(100)) as begin declare @i int declare @s int set @i=1 set @s=1 while(@i>0) begin set @i=cha

sql 存储过程有insert和update怎么改为函数

问题描述 sql 存储过程有insert和update怎么改为函数 知道函数不能用insert和update,但课本题目就是这样. 解决方案 你应该去问你们的老师 解决方案二: use hr go if exists(select * from sys.sysobjects where [name]='grades') drop function grades go create function grades(@employee_Id int ,@start_date datetime,@jo