精华内容
下载资源
问答
  • 判断参数时候有返回值: 1.if exitsts(参数):缺点 在里面不能直接使用begin end; 2.if(参数 is null):直接判断是否...有返回值的存储过程: ALTER PROCEDURE [dbo].[InsertOneUser] @OName varchar(50...
    • 判断参数时候有返回值:
      1.if exitsts(参数):缺点 在里面不能直接使用begin end;
      2.if(参数 is null):直接判断是否为空;
      下面这种方法不能判断出空值
      DECLARE @参数 int =0
      if(@参数=0);

    • 有返回值的存储过程:

    ALTER PROCEDURE [dbo].[InsertOneUser] 
    	
    	@OName varchar(50) =NOTnull,
    	@Prefecture varchar(20)= NOTnull,
    	@Username varchar(20) =NOTnull,
    	@Password varchar(20) =NOTnull
    	
    	/*@returnMessage varchar(200) output */
    AS
    BEGIN
    	Declare @sameOId int,
    			@Samename nvarchar(50)=N''
    	set @sameOId=(select Id from t_Orgnization where Name= @OName)
    	if(@sameOId IS null)
    	begin
    		exec InsertOneOrg @OName ,@Prefecture,0
    		/* 插入组织后重新查询组织id*/
    		set @sameOId=(select Id from t_Orgnization where Name= @OName)
    		if(@sameOId IS null)
    		begin
    			return -1
    			/*
    			set @returnMessage ='组织列表无此组织,插入新组织失败,插入用户失败'
    			print('插入组织失败')*/
    		end
    		else
    		begin
    			begin
    				insert into t_Users (OId,OName,Name,Password,Permission) values (@sameOId,@OName,@Username,@Password,'admin')
    				/* set @returnMessage ='组织列表无此组织,插入新组织成功,插入用户成功'*/
    				return 2
    			end	
    		end
    	end	
    	else    /*组织中有重复的*/
    	begin
    		/*查询用户是否有重名*/
    			set @Samename=(select Name from t_Users where Name=@Username)
    			if(@Samename IS NULL)
    			begin
    				insert into t_Users (OId,OName,Name,Password,Permission) values (@sameOId,@OName,@Username,@Password,'admin')
    				
    				/*set @returnMessage ='组织列表包含此组织,插入用户成功'*/
    				return 1
    			end
    			else
    			begin
    				
    				/*set @returnMessage ='组织列表包含此组织,用户名重复,插入失败'*/
    				return 0
    			end
    	end 
    	
    	
    END
    
    展开全文
  • SQL Server存储过程

    千次阅读 2018-12-18 18:48:59
    SQL Server存储过程 定义: 用户通过制定存储过程的名称并给出参数来执行它; SQL Server为了实现特定任务,而将一些多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上,由数据库服务器来调用; 命名...

    SQL Server存储过程

    定义:

    • 用户通过制定存储过程的名称并给出参数来执行它;
    • SQL Server为了实现特定任务,而将一些多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上,由数据库服务器来调用;
    • 命名前缀:proc_名称,proc是procedure(过程)的简写;

    优缺点

    优点

    • 重复使用,减少数据库开发人员的工作量;
    • 封装复杂的数据库操作,简化操作流程;
    • 减少网络流量,调用过程只需传递名称与参数;
    • 安全性,防止SQL注入式攻击,同时可设定用户对指定存储过程的执行权限;
    • 误解:比SQL语句执行快(未被认证)

    缺点

    • 调试麻烦;
    • 移植问题;
    • 重新编译问题,当引用关系的对象发生改变时,受影响的存储过程、包将需要被重新编译;
    • 不支持面向对象设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架;

    分类

    系统存储过程

    • 存储在系统数据库master中;
    • 用来从系统表中获取信息,为系统管理员提供帮助,为用户查看数据库提供方便;
    • 存储过程位于数据库服务器中,以sp_开头,系统存储郭恒定义在系统定义和用户定义的数据库中,调用时,不必在存储过程中加数据库限定名;
    • 一些系统存储过程只能由系统管理员使用,而有些系统存储过程通过授权可以被其它用户使用;

    用户存储过程(自定义存储过程)

    • 存储在tempdb数据库中;
    • 用户使用T_SQL语句编写的,为了实现某一特定业务需求,在数据库中编写的T_SQL语句集合,自定义存储过程可以接受输入参数、向客户端返回结果和信息,返回输出参数等;
    • 临时存储过程:
      • 全局的临时存储过程,存储过程名前加上“##”;
      • 局部临时存储过程,存储过程名前加上“#”;

    扩展存储过程

    • 以在SQL Server环境外执行的动态链接(DLL文件)来实现,可以加载到SQL Server实例运行的地址空间来执行;
    • 扩展存储过程以前缀“xp_”来标识;

    创建存储过程

    无参存储过程

    • Proc与Procedure相同;
    • 调用存储过程:exec
    • 创建存储过程
    -- 判断存储过程是否存在
    if (exists (select * from sys.objects where name = 'getAllBooks'))
        Drop Procedure getAllBooks
    go
        -- 创建存储过程
        Create Procedure getAllBooks 
    as
        -- SQL语句
        Select * From books
    
    • 修改存储过程
    Alter Procedure getAllBooks
    as
        -- 修改后SQL语句
        Select book_name From books
    
    • 删除存储过程
    -- 删除存储过程
    drop Procedure getAllBooks
    
    • 重命名存储过程
    sp_rename getAllBooks,proc_get_allBooks
    

    有参存储过程

    • 参数分类
      • 输入参数,用于向存储过程传入值;
      • 输出参数,用于调用存储过程后,返回结果;
    • 值传递和引用传递
      • 基本数据类型赋值属于值传递;引用类型之间赋值属于引用传递;
      • 值传递传递的是变量值;引用传递传递的事对象的引用地址;
      • 值传递后,两个变量改变的是各自的值;引用传递后,两个引用改变的是同一个对象的状态;
    • 单个参数存储过程
    if(exists (Select * From sys.objects Where name = 'searchBooks'))
        Drop Procedure searchBooks
    go 
    Create Proc searchBooks(
        -- 参数声明(@参数名 类型 [=默认值] )
        @bookID int
        )
    as 
        Select * From books 
        Where book_id = @bookID
    
    -- 调用存储过程
    exec searchBooks 1;
    
    • 多个参数存储过程(两个参数)
    if(exists (Select * From sys.objects Where name = 'searchBooks'))
        Drop Procedure searchBooks
    go 
    Create Proc searchBooks(
        @bookID int ,
        @auth nvarchar(50)
        )
    as 
        Select * From books 
        Where book_id = @bookID
        And book_auth = @auth
    -- 调用存储过程
    exec searchBooks 1 , '孔子'
    
    • 带返回值的存储过程
    if (exists (Select * From sys.objects Where name = 'getBookId'))
        Drop Procedure getBookId
    go 
    Create Procedure getBookId(
        @bookauth nvarchar(20), --无默认值
        @bookId int output --无默认值
    )
    as 
        Select @bookId = book_Id From books
        Where book_auth = @bookauth
    
    --调用存储过程
    declare @Id int 
    exec getBookId '金庸',@Id output
    select @id as booksId
    
    • 参数带通配符的存储过程(参数有默认值)
    if (exists (select * from sys.objects where name = 'charBooks'))
        drop proc charBooks
    go
    create proc charBooks(
        @bookAuth varchar(20)='金%',--默认值
        @bookName varchar(20)='%'--默认值
    )
    as 
        select * from books where book_auth like @bookAuth and book_name like @bookName;
    
    --执行存储过程
    exec  charBooks  '孔%','论%'; 
    
    展开全文
  • 主要介绍了获取SqlServer存储过程定义的三种方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • sqlserver存储过程和触发器

    千次阅读 2019-01-17 11:57:53
    sqlserver存储过程和触发器 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句。 存储过程的特点,触发器和存储过程的区别,触发器的优点...

    存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
    通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句。
    存储过程的特点

    • 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
    • 当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
    • 存储过程可以重复使用,可减少数据库开发人员的工作量。
    • 安全性高,可设定只有某些用户才具有对指定存储过程的使用权

    触发器和存储过程的区别:
      触发器与存储过程的区别是运行方式的不同
      触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行;
      存储过程需要用户,应用程序或者触发器来显示地调用并执行。

    触发器的优点
     1.触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
     2.触发器可以通过数据库中的相关表进行层叠修改。
     3.触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。

    触发器的作用
     触发器的主要作用是能够实现由主键和外键所不能保证的复杂参照完整性数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下几个方面:

    • 强制数据库间的引用完整性
    • 级联修改数据库中所有相关的表,自动触发其它与之相关的操作
    • 跟踪变化,撤销或回滚违法操作,防止非法修改数据
    • 返回自定义的错误消息,约束无法返回信息,而触发器可以
    • 触发器可以调用更多的存储过程

    数据库建库建表操作,以下实例基于下面的数据库表

    -- 创建数据库shared_bicycles
    create database shared_bicycles;
    
    -- 创建用户表
    drop table users;
    create table users(
    	userid int primary key,-- 用户编号
    	username varchar(10) not null unique,--用户姓名
    	userphone varchar(12) not null,--联系方式
    	userpassword varchar(12) not null,--用户密码
    	usercredit	varchar(1)	-- 用户信用(0不需交押金,1需交押金)	
    );
    -- 插入数据
    insert into users values(0,'李强','15914587023','12345678','0');
    insert into users values(1,'王伟','13914897023','abcdefgh','1');
    insert into users values(2,'李明','18714581593','123456def','0');
    insert into users values(3,'张华','12314584923','123456ghj','1');
    insert into users values(4,'小刘','15614580023','123456dfs','0');
    
    --创建单车信息表
    drop table bicycles;
    create table bicycles(
    	bikeid char(5)	primary key,--车辆编号
    	bikelocation varchar(12) not null,--车辆位置
    	onthedate date not null,--投放日期
    	bikestate varchar(1) not null--单车状态(0可使用,或1需维修)	
    );
    
    insert into bicycles values('10000','建设路129号','2018-10-20','0');
    insert into bicycles values('10001','人民公园','2018-10-21','0');
    insert into bicycles values('10002','建设路9号','2018-11-20','0');
    insert into bicycles values('10003','人民北路8号','2018-10-20','1');
    insert into bicycles values('10004','光华大道1号','2018-09-05','0');
    
    -- 创建订单表
    drop table orders;
    create table orders(
    	orderid	int	primary key,--订单编号
    	startingtime	datetime not null,--起始时间
    	endingtime	datetime,--结束时间
    	origin	varchar(20) not null,--订单起始地点
    	endlocation	varchar(20),--订单结束地点
    	userid	int,--用户编号
    	bikeid char(5),
    	amount	varchar(20),--金额
    	order_state char(1),--订单状态(0表示订单完成,1表示订单未完成)
        foreign key(userid) references users(userid),--设置外键
    	foreign key(bikeid) references bicycles(bikeid)--设置外键
    );
    
    -- 创建管理员表:报修、位置、时间、车辆号
    drop table admins;
    create table admins(
    	repair	varchar(1) not null,--报修情况(0未报修,1报修)
    	location varchar(12) not null,--位置
    	usingTime datetime not null,--时间
    	bikeid	char(5),--车辆号
    	foreign key(bikeid) references bicycles(bikeid)--设置外键
    );
    
    -- 创建充值表
    drop table deposits;
    create table deposits(
    	duration datetime not null,--时长
    	userid	int	,--用户编号
    	packagename	varchar(6) not null,--套餐名
    	recordtime	datetime not null,--充值时间
    	packageprice float not null,--价格
    	foreign key(userid) references users(userid)--设置外键
    );
    

    sqlserver存储过程实例:

    --存储过程1 用户用车:输入userid、bikeid、起始地点
    drop proc pr_use_bike;
    go 
    create procedure pr_use_bike
    	@userid int,
    	@bikeid char(5),
    	@origin varchar(20)
    as
    	declare @msg varchar(30)
    	declare @orderid int
    	declare @now_time datetime
    begin
    	if (select usercredit from users where userid=@userid)='0'
    		begin
    		if (select bikestate from bicycles where bikeid=@bikeid)='0'
    			begin
    			set @msg='用户开始用车'
    			set @orderid=(select max(orderid) from orders)+1
    			set @now_time=(select convert(varchar,GETDATE(),20))
    			insert into orders(orderid,startingtime,origin,userid,bikeid,order_state) values(@orderid,@now_time,@origin,@userid,@bikeid,'1')
    			end
    		else
    			set @msg='单车损坏,请换一辆'
    		end
    	else
    		set @msg='用户还未充值,请先充值!' 
    	select @msg
    end
    go
    --执行存储过程,需要传入参数
    exec pr_use_bike @userid=0,@bikeid='10000',@origin='新华公园';
    -- 提示“用户开始用车”
    exec pr_use_bike @userid=0,@bikeid='10003',@origin='新华公园';
    --提示“单车损坏,请换一辆”
    exec pr_use_bike @userid=1,@bikeid='10000',@origin='新华公园';
    -- 提示“用户还未充值,请先充值!”
    
    -- 存储过程2:用户还车:user_id,bikeid,订单号,结束地点,金额
    drop proc pr_return_bike;
    go
    create procedure pr_return_bike
    	@userid	int,
    	@bikeid char(5),
    	@endlocation varchar(20),
    	@amount varchar(20) = '1'
    as
    	declare @msg varchar(30)
    	declare @now_time datetime
    	declare @orderid int
    	declare @order_state datetime
    begin
    	set @now_time=(select convert(varchar,GETDATE(),20))
    	set @msg='用户还车成功'
    	set @orderid=(select orderid from orders where userid=@userid and bikeid=@bikeid and order_state='1')
    	
    	update orders set endingtime=@now_time,endlocation=@endlocation,amount=@amount where orderid=@orderid
    	print @msg
    	print '订单生成完成'
    	select * from orders where orderid=@orderid
    end
    go
    
    exec pr_return_bike @userid=0,@bikeid='10000',@endlocation='新华书店',@amount=1;
    
    -- 存储过程3:用户充值:user_id,套餐名,价格
    drop proc pr_recharge;
    go
    create procedure pr_recharge
    	@userid	int,
    	@packagename varchar(6),
    	@packageprice float
    as
    	declare @msg varchar(30)
    	declare @now_time datetime
    	declare @duration datetime
    begin
    	set @now_time=(select convert(varchar,GETDATE(),20))
    	set @duration=(select dateadd(d,30,@now_time))
    	set @msg='用户充值'
    	insert into deposits values(@duration,@userid,@packagename,@now_time,@packageprice);
    	select * from deposits where userid=@userid and recordtime=@now_time
    end
    go
    -- 执行
    exec pr_recharge @userid=0,@packagename='套餐一',@packageprice=19.9;
    

    创建存储过程需要注意的点Tips:

    • sqlserver中整个存储过程需要用go…go批处理所包裹住,作为一个整体执行
    • 执行存储过程,使用exec命令,并传入参数
    • 如果存储过程中需要用到多层if…else嵌套判断,需要使用多组begin…end进行包裹住,例如参照存储过程1用户用车的存储过程样式。
    • 写好的存储过程,一定要测试是否正常work

    sqlserver触发器实例

    --设置触发器check_user_passwd:检查创建新用户密码长度大于7小于等于12
    go
    create trigger check_user_passwd
    on users After insert
    as 
    	if len((select userpassword from inserted))<=7 or len((select userpassword from inserted))>12
    		begin
    		print '用户密码长度必须大于7位小于等于12位'
    		rollback transaction
    		end
    go
    
    select * from users;
    -- 测试触发器check_user_passwd
    -- 插入错误,提示:‘用户密码长度必须大于7位小于等于12位’
    insert into users values(8,'小吴','15614580023','12345','0');
    -- 能正确插入,触发器正常工作
    insert into users values(6,'小吴','15614580023','12345abcd','0');
    
    --设置触发器after_insert_bicycle:
    --表示在新插入一条单车数据时,如果单车需要维修,则在管理员维修表中新增一条需要维修的记录
    
    go
    create trigger after_insert_bicycle
    on bicycles after insert 
    as
    if (select bikestate from inserted)='1'
    begin
    		insert into admins values ('1',(select bikelocation from inserted),(select onthedate from inserted),(select bikeid from inserted));
    end
    go
    
    -- 测试触发器before_insert_bicycle
    insert into bicycles values('10009','光华大道9号','2019-01-05','1');
    select * from admins;
    

    sqlserver触发器注意事项tips:

    • 触发器同样需要使用go…go包裹住
    • sqlserver中触发只含有instead of和after两种类型,并没有before类型,在具体逻辑中可以结合rollback transaction事物回滚

    引用资料

    https://www.cnblogs.com/genesis/p/4914010.html
    https://www.cnblogs.com/wangprince2017/p/7827091.html

    展开全文
  • 为大家介绍sql server存储过程中if esle的用法,供大家学习参考。数据库中有两张表,A表主键为自动增长的并且是B表的外键且允许为空
  • Hibernate 调用sqlserver存储过程

    千次阅读 2013-09-30 09:49:33
    Hibernate 调用sqlserver存储过程   建表person: 调用sqlserver存储过程" title="Hibernate 调用sqlserver存储过程" style="margin:0px; padding:0px; border:0px; list-style:none"> 存储过程: ...

    Hibernate 调用sqlserver存储过程

     
    建表person:

    Hibernate <wbr>调用sqlserver存储过程

    存储过程:

    if exists(select name from sysobjects where name='person_select' and
    type='P')
     drop procedure dbo.person_select
    go
     create proc dbo.person_select
     as
      select * from person
    go

    hibernate.hbm.xml:

    Hibernate <wbr>调用sqlserver存储过程

    pojo就不写了直奔主题

    我是在dao的实现类DaoImpl里面写的主要方法:

    这是引入的包

    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;

    import org.springframework.orm.hibernate3.HibernateCallback;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;

    下面是实现方法

    public List<Person> findAllPersons_proc() {
       System.out.println("0----------------");
      return (List)getHibernateTemplate().execute(new HibernateCallback() {
        public Object doInHibernate(Session session)
          throws HibernateException, SQLException {
         String hql = "{call person_select}";
         session.flush();
         ResultSet rs=session.connection().prepareCall(hql).executeQuery();
         List<Person> list=new ArrayList<Person>();
         while (rs.next()) {
          Person p=new Person();
          p.setId(rs.getInt(1));
          p.setName(rs.getString(2));
          p.setAge(rs.getInt(3));
          list.add(p);
         }
         rs.close();
         session.close();
         return list;
        }
       });
     }

    用的时候直接Action调用service,service调用dao,调到该方法就可

    serice实现类serviceImpl:

    Hibernate <wbr>调用sqlserver存储过程


    Action 方法:

    Hibernate <wbr>调用sqlserver存储过程

    其余的增删改查可以类似写法即可

    这是查

    session.connection().prepareCall(hql).executeQuery();

    改executeQuery();为executeUpdate就行 。。。。。。。等等的
    ---------------------lieh


     hibernate调sqlserver存储过程,做插入操作

    sqlserver:存储过程  传进来三个参数

    if exists(select name from sysobjects where name='person_save' and
    type='P')
     drop procedure dbo.person_save
    go
     create proc dbo.person_save
      @id varchar(20),
      @name varchar(20),
      @age varchar(20)
     as
      insert into person
      values
      (@id,@name,@age)
     return
    go

    然后在person.hbm.xml里面这个存储过程配置如下:

    <sql-query name="person_save" callable="true">
         <return alias="person" class="com.yitac.ssh.bean.Person">
         </return>
         {call person_save(?,?,?)}
    </sql-query>

    DaoImpl里面的方法:  --这是一个无返回值的方法

    public void savePersons_proc(final String id,final String name,final String age) {

     //参数要是final类型的,否则在下面用的时候得不到参数

    //dao 里面的  void savePersons_proc(String id,String name,String age);可以这样写
      System.out.println("0----------------");
      getHibernateTemplate().execute(new HibernateCallback() {
       public Object doInHibernate(Session session)
        throws HibernateException, SQLException {
           String hql = "{call person_save(?,?,?)}";
           session.flush();
           CallableStatement casm=session.connection().prepareCall(hql);
           System.out.println("----------DaoIMpl----------");
           casm.setString(1, id);//设置参数值
           casm.setString(2, name);
           casm.setString(3, age);
           casm.execute();
           return null;
       }
      });
     }

    这是一个有返回值的方法:

    public boolean savePersons_proc2(String id,String name,String age) {
      System.out.println("0----------------");
      try {
       Session session=getHibernateTemplate().getSessionFactory().openSession();
       session.flush();
       CallableStatement cs=session.connection().prepareCall("{call person_save(?,?,?)}");
       cs.setString(1, id);
       cs.setString(2, name);
       cs.setString(3, age);
       boolean b=false;
    //   b=cs.execute();

    //使用execute,返回值不知为啥为false,存储过程成功执行了,数据库数据也插入了,但就是返回为false;
       int i=cs.executeUpdate();
    //这里因为我的存储过程直插入了一行数据,所有如果成功执行存储过程,那么返回值必定是1,

    //换言之,如果我的存储过程执行力四行插入数据的话,如此成功执行,则返回值必定是4

    // 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和

    //DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。

    //executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP

    //TABLE 等不操作行的语句,executeUpdate 的返回值总为零。 

    //所有对i的值进行判断,来确定返回值

        if(i==1){

          b=true;

        }
       return b;
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       System.out.println("------dao impl false  Exce...------");
       return false;
      }
     }

    方法executeQuery
       用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。
      
       方法executeUpdate
       用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
      
       使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。

        方法execute:
       用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能
      
       execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
       因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。
       对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。
       当 SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):
      
      ((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))
      
       如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象,则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来检索下一个结果集。如上所述,如果 getResultSet 返回 null,则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。
      
       当 getMoreResults 返回 false 时,它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:
      
      ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
      
       下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数:
      
      
      stmt.execute(queryStringWithUnknownResults);
      while (true) {
      int rowCount = stmt.getUpdateCount();
      if (rowCount > 0) { // 它是更新计数
      System.out.println("Rows changed = " + count);
      stmt.getMoreResults();
      continue;
      }
      if (rowCount == 0) { // DDL 命令或 0 个更新
      System.out.println(" No rows changed or statement was DDL
      command");
      stmt.getMoreResults();
      continue;
      }
      
      // 执行到这里,证明有一个结果集
      // 或没有其它结果
      
      ResultSet rs = stmt.getResultSet;
      if (rs != null) {
      . . . // 使用元数据获得关于结果集列的信息
      while (rs.next()) {
      . . . // 处理结果
      stmt.getMoreResults();
      continue;
      }
      break; // 没有其它结果


    展开全文
  • SqlServer 存储过程 if else 两层判断 语句拼接
  • ...SqlServer存储过程的声明方式: Create proc存储过程名称 As T-sql命令 SqlServer存储过程分为无参数存储过程和有参数存储过程 1)没有参数的存储过程 调用存储过程 Ex
  • sql server存储过程编程

    千次阅读 2016-03-05 11:36:50
    存储过程是一组完成特定功能的SQL 语句集合,经编译后存储在数据库中。   存储过程作为一个单元进行处理并以一个名称来标识。它能向用户返回数据、向数据库表中写入或修改数据等操作。 用户通过指定存储过程的...
  • SQL Server 存储过程分类

    千次阅读 2013-01-29 13:16:54
    SQL Server 2012中的存储过程是使用T-SQL代码编写的代码段。在存储过程中可以声明变量、执行条件判断语句等其他编程功能。SQL Server 2012 中有多种类型的存储过程,总的可以分为如下3类:系统储存过程、用户存储...
  • sqlserver存储过程

    千次阅读 2008-09-09 22:42:00
    Sql Server存储过程 存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。一、使用存储过程的优势:1、模块化程序设计:只需创建过程一次并将其存储在数据库中,以后即可在程序中...
  • 存储过程中我想判断用户名是否存在 info是表名 然后return的值在c#里用ParameterDirection.ReturnValue获得 但是为什么无论如何返回值都是0 但是结果倒好像是对的 不存在的话插入 存在的话不插入了 纠结那个返回值 ...
  •  好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件,...
  • sqlserver存储过程学习(通俗易懂)

    万次阅读 多人点赞 2016-09-02 17:02:07
    ---------------------------------------------------------------------...-------------------------------存储过程Study------------------------------ -----------------------------------------------------...
  • 通过sql server存储过程周期性地根据条件字段值设置其他字段,包括条件判断和事务管理。实例语句如下。 数据库表(vipPoint)定义语句如下:CREATE TABLE [dbo].[vipPoint] ( [userCode] [varchar] (50) ...
  • SQLserver存储过程加密、解密

    千次阅读 2019-06-22 14:50:40
    SQLserver存储过程加密、解密 作者:邱名涛 撰写时间:2019 年 6 月 22 日 关键技术: 数据库存储过程加密、解密 –加密存储过程 –判断表是否存在,如果存在就删除 if object_id(N'dbo.Test',N'U') is not null drop...
  • Sql Server 存储过程调用存储过程接收输出参数,返回值2017年06月02日 09:32:42阅读数:7800创建存储过程:[c-sharp] view plain copyCREATE PROCEDURE [dbo].[GetCustomers] (@rowcount INT OUTPUT) AS ...
  • oracle存储过程和sqlserver存储过程

    千次阅读 2019-04-22 16:30:18
    oracle存储过程: 声明: 外部参数 只有数据类型没有大小 Procedure Pro_Insert_Stuff_Check( v_id VARCHAR2, v_card_id VARCHAR2, ...
  • SQL SERVER存储过程实现分页

    千次阅读 2019-05-22 12:21:46
    Create PROCEDURE [dbo].[sp_PageList]--创建存储过程 ( @StationID nvarchar(32),--工位ID @PageSize INT, --每页显示的项数 @PageIndex INT--当前页数 ) AS BEGIN --获取总行数,用count(*) declare @Sqlselect ...
  • sqlserver 存储过程 语法

    千次阅读 2007-07-17 15:13:00
    SQLSERVER 存储过程 语法SQLSERVER存儲過程的寫法格式規格Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->************************************************...
  • Excel使用ADO调用SQL Server存储过程

    千次阅读 2015-03-25 20:32:30
    后期对于投票结果需要进行一些权重的计算,过程比较复杂,便想到把计算过程放在SQL Server端,使用存储过程实现。但是,在调用存储过程的过程中却遇到了问题,一直无法返回记录集。最后发现问题出现在记录集的...
  • sqlserver存储过程where条件参数为空不加入筛选
  • SQLServer 存储过程

    千次阅读 2016-09-08 23:30:47
    SQLServer默认会在完成存储过程时自动返回一个0值。 语法:RETURN [] 注意:返回的必须是整数。是无条件地从存储过程中退出的。这是指五路运行到存储过程的那个位置,在调用RETURN 语句之后将不会执行任何一行...
  • sql server 存储过程事务处理

    千次阅读 2010-07-18 11:24:00
    from:http://www.sqlstudy.com/sql_article.php?id=2008060701<br />在 SQL Server 中数据库事务处理是个... 在编写 SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update s
  • SQLServer 存储过程中使用事务

    千次阅读 2017-02-27 15:29:35
    存储过程SQL: create proc ***** @GoodsId int, @Number int, @StockPrice money, @SupplierId int, @EmpId int, @StockUnit varchar(50), @StockDate datetime, @TotalMoney money , @ActMoney money , @baseId ...
  • @a @b ``` where case when (@a = null) then 1 = 1 else @a=a and b=@b ``` 这样写是会报错的。好像是因为where 后面应该跟一个值。...我这里的参数@a和值a都有可能会是空,因为null和null比较是不等的。...
  • 1. 存储的值若为guid 但...2. 需要更改列的格式为uniqueidentifier 存储过程的变量也改为uniqueidentifier 3.判断是否需要添加条件 传入空的guid 但不能为字符串类型 USE [commonSystem] GO /****** Objec
  • sql server存储过程 以及几个常用案例

    千次阅读 2016-04-23 10:41:08
    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的...
  • 【实验目的】 1、  ...SERVER高级设计存储过程和触发器的原理; 5、  可以简单的设计存储过程和触发器;   【实验原理】 1、  存储过程基本原理: 1.1系统存储过程 系统存储过程...
  • 1. top order by 转换成 rownum order by 的... sqlserver: 先order by 再top oracle: 先rownum 再 order by 2. 已有数据的字段类型不匹配,通过下列语句修改。 alter table css_sed rename column action to myacti

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,206
精华内容 34,882
关键字:

sqlserver存储过程判断