热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sqlserver存储过程创建以及应用

我想对于研发的人员来说,存储过程大家肯定耳熟能详,在这里我就把我简单使用的体会描述下:存储过程概念:存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据

我想对于研发的人员来说,存储过程大家肯定耳熟能详,在这里我就把我简单使用的体会描述下:

        存储过程概念:存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。

    存储过程的优点:

      1. 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。

  2.存储过程可被作为一种安全机制来充分利用,可以很好的防止sql语句的注入。

       创建存储过程:

      1. 创建语法:

create proc| procedure 存储过程名称

@id int --默认是输出参数即指的是当做条件的参数,@name varchar20output --输出参即指的是输出的参数结果

with encryption --加密操作,这样就不会显示存储过程的详细信息

as

begin

T-sql语句

end

    2.创建存储过程时,首先要检查数据库中是否已经存在了同名的存储过程,这里有两种方式来实现此功能:

1.if (object_id('存储过程名','P')isnotnull)

    drop proc 存储过程名
   2.if (exists (select * from sys.objects where name = '存储过程名'))
drop proc 存储过程名  --其中sys.objects是存储所有对象的表,其中包括存储过程、触发器等。这里的sys.objects可以换成sys.procedures 这个是存储所有存储过程的表
   3.实例
    1. 无参数的存储过程
     create proc proc_users
     as
      select * from users 
    2. 带参数的存储过程  (拿登陆的存储过程来说)
if (object_id('proc_usersEncryotion', 'P') is not null)
drop proc proc_usersEncryotion
create proc proc_usersEncryotion
(@username varchar(100), @upwd varchar(100) )
with encryption
-- 加密,加密之后自己也看不见存储过程的详细内容!
as
begin
select * from Users where UserName=@username and Upwd=@upwd;
end
go
3.带输入输出参数的存储过程:
ALTER proc [dbo].[proc_userOUTPUT]
(@id int ,@name varchar(20) output)
as
begin 
select @name=UserName from Users  where UserId=@id
end
在程序中调用:
public string GetName(int id)
        {
            string name = "";
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "proc_userOUTPUT";
            if (con.State != ConnectionState.Open)
                con.Open();
            cmd.COnnection= con;
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter[] param = { new SqlParameter("@id", id), new SqlParameter("@name", SqlDbType.VarChar,20) };


            foreach (var para in param)
            {
                cmd.Parameters.Add(para);
            }
            cmd.Parameters["@name"].Direction = ParameterDirection.Output;
            cmd.ExecuteNonQuery();
            name = cmd.Parameters["@name"].Value.ToString();


            return name;
        }
      4. 带输入参数以及返回值的存储过程:
ALTER proc [dbo].[proc_UserLogin]
( @name varchar(20),@upwd varchar(20))
as
declare @value int
begin
select @value=COUNT(*) from Users where UserName=@name and Upwd=@upwd 
return @value;
end
  这样就必须接return返回的值,程序中的操作如下:
public int usersLogin( string username,string upwd)
        {
            int i = 0;
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "proc_UserLogin";
            if (con.State != ConnectionState.Open)
                con.Open();
            cmd.COnnection= con;
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter[] param = { new SqlParameter("@name", username), new SqlParameter("@upwd", upwd), new SqlParameter("@value", SqlDbType.Int) };
            //SqlParameter papa = new SqlParameter("@name", SqlDbType.VarChar, 20);
            //cmd.Parameters.Add(papa);
            //cmd.Parameters["@name"].Value = username;
            foreach (var para in param)
            {
                cmd.Parameters.Add(para);
            }
            cmd.Parameters["@value"].Direction = ParameterDirection.ReturnValue;
            cmd.ExecuteNonQuery();


            i = Convert.ToInt16(cmd.Parameters["@value"].Value.ToString());
            return i;
        }
这样i的值就会是返回的值。
 好了就简单的介绍到这里,希望大家能够踊跃的评论,大家一起学习


推荐阅读
  • 定制数据层关键字:数据层,访问,元数据,数据访问模型http://www.gaodaima.com/35448.html定制数据层_sqlserver ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 这篇文章主要讲解了“SQLServer与Access数据库ASP代码有什么区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深 ... [详细]
  • SqlServer分区表概述(转载)
    什么是分区表一般情况下,我们建立数据库表时,表数据都存放在一个文件里。但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
author-avatar
杨斜2602934873
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有