`
yeanjone
  • 浏览: 3357 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

sql server 存储过程简介与使用方法

阅读更多
语法:

DECLARE

{

{@local_variable data_type}

} [,...n]

例如:

declare @ID int --申明一个名为@ID的变量,类型为int型

三.在SQL Server窗口中打印出变量的值

语法:

PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr

四.变量赋值

例如:

--从数据表中取出第一行数据的ID,赋值给变量@id,然后打印出来

Declare @ID int

Set @ID = (select top(1) categoryID from categories)

Print @ID

在SQL中,我们不能像代码那样直接给变量赋值,例如@id = 1,如果要达到这样的功能,可以这样写:

Declare @ID int

Set @ID = (select 1) -- 类似 @ID=1

Select @id=1 -- 类似 @ID=1

Print @ID

五.变量运算(+,-,*,/,……)

以下必要时候省略变量申明

Set @ID = (select 1+5) --类似 @ID=1+5

Set @ID=(select 1-@ID) --类似 @ID=1-@ID

六.比较操作符

? > (greater than).

? < (less than).

? = (equals).

? <= (less than or equal to).

? >= (greater than or equal to).

? != (not equal to).

? <> (not equal to).

? ! < (not less than).

? !> (not greater than).

没什么说的

七.语句块:Begin … end

将多条语句作为一个块,类似与C++,C#中的{ }

例如:

Begin

Set @ID1 = (select 1)

Set @ID2 = (select 2)

End

八.If, if…else…

语法:

IF Boolean_expression

{sql_statement | statement_block}

[ELSE

{sql_statement | statement_block}]

例如:

If @id is not null

Print ‘@id is not null

if @ID = 1

begin

Set @ID = (select 1 + 1)

end

else

begin

set @ID=(select 1+2)

end

上面的例子用到了比较操作符,语句块,和IF的语法。

九.执行其他存储过程 EXEC

例如

EXEC dbo.[Sales by Year] @Beginning_Date=’1/01/90’, @Ending_Date=’1/01/08’

十.事务

语法:

BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable]

例如

BEGIN TRAN

-- 做某些操作,例如Insert into …

if @@error <> 0

BEGIN

ROLLBACK TRAN

END

else

BEGIN

COMMIT TRAN

END

十一.游标

我们可以在存储过程中用Select语句取出每一行数据进行操作,这就需要用到游标。

语法:

DECLARE cursor_name CURSOR

[LOCAL | GLOBAL]

[FORWARD_ONLY | SCROLL]

[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]

[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]

[TYPE_WARNING]

FOR select_statement

[FOR UPDATE [OF column_name [,...n]]]

例如:

DECLARE @au_id varchar(11), @au_fname varchar(20) –申明变量

--申明一个游标

DECLARE authors_cursor CURSOR FOR

SELECT au_id, au_fname FROM authors

--打开游标

OPEN authors_cursor

--取出值

FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname

--循环取出游标的值

WHILE @@FETCH_STATUS = 0

BEGIN

Print @au_id

Print @au_fname

Print ‘ ’

FETCH NEXT FROM authors_cursor

INTO @au_id, @au_fname

END

CLOSE authors_cursor –关闭游标

DEALLOCATE authors_cursor --释放游标

我觉得上面的是存储过程常用的一些东东,如果要更深入的了解,更详细的帮助,请参考SQL Server的帮助文档



例子:

我自己做了一个,没有问题,你可以看一下  
  use   Northwind  
  go  
  create   proc   test  
      @StartOrderID   int,  
      @EndOrderID   int,  
      @Code   varchar(1000)   Out  
  As  
      Begin  
          Declare   @tmp   int  
                  Set   @Code=''          
                  Declare   #cur_orders   cursor     for     Select   OrderID   From   Orders    
                          where   OrderID>=@startOrderID   and   OrderID<=@EndOrderID  
                          for   read   only  
                  Open   #cur_Orders  
                  fetch   next   from   #cur_orders   into   @tmp  
                    while   @@fetch_Status=0  
                      Begin  
                              Set   @Code=@Code+'-'+convert(varchar(8),@tmp)  
                                fetch   next   from   #cur_orders   into   @tmp  
                      End  
                  close   #cur_Orders  
                  Deallocate   #cur_Orders  
                  return  
           
      End  
  go  


续2  
        String   ret=null;  
          try{  
              Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");  
              String   url  
  ="jdbc:microsoft:sqlserver://192.168.0.102:1433;DatabaseName=Northwind";  
              String   user="sa";  
              String   password="";  
              Connection   conn=   DriverManager.getConnection(url,user,password);  
              CallableStatement   stmt=conn.prepareCall("exec   test   ?,?,?");  
              stmt.setInt(1,10248);  
              stmt.setInt(2,10284);  
              stmt.registerOutParameter(3,Types.VARCHAR);  
              stmt.setString(3,ret);  
              stmt.execute();  
              System.out.println(stmt.getString(3));  
              stmt.close();  
              stmt=null;  
              conn.close();  
          }catch(ClassNotFoundException   e){  
              e.printStackTrace();  
          }catch(SQLException   e){  
              e.printStackTrace();  
          }  


上面的例子没有问题,针对你的情况,我又写了一个,应该可以解决你现在的问题  
   
  --   新建一个表  
      Create   table   tmpOrders   (  
            OrderID   int,  
            CustomerID   nchar(5)  
    )  
   
  --把Orders   里的OrderID列全部插入,这样Orders与tmpOrders之间就是1:1关系了  
  insert   into   tmpOrders  
  Select   distinct   orderID,'tmp'   from   Orders  
   
  create   proc   test  
      @StartOrderID   int,  
      @EndOrderID   int,  
      @Code   varchar(1000)   Out  
  As  
      Begin  
          Declare   @newOrderID   int  
          Declare   @newCustomerID   nchar(5)  
          Declare   @DummyInt   int  
          Declare   @DummyChar   nchar(5)  
                  Set   @Code=''      
                  /*  
                                                                                                                                  1:1    
                          temp   table/formal   table   is   synchronized   tmpOrders     <--->   Orders  
                          fetch   from   Orders,   update   tmpOrders  
                  */  
   
                  --   for   temp   table  
                  Declare   #cur_tmpOrders     Cursor   for   select   OrderID,CustomerID    
                                From   tmpOrders    
                                      where   OrderID>=@startOrderID    
                                      and   OrderID<=@EndOrderID                                    
                                      for     update  
   
                  --for   formal   table  
                  Declare   #cur_orders   cursor     for     Select   OrderID,CustomerID    
                            From   Orders    
                          where   OrderID>=@startOrderID    
                          and   OrderID<=@EndOrderID    
                          for   read   only  
                  Open   #cur_Orders  
                  Open   #cur_tmpOrders  
   
                  fetch   next   from   #cur_tmpOrders   into   @DummyInt,@dummyChar   --Important!!!  
                  fetch   next   from   #cur_orders   into   @NewOrderID,@NewCustomerID  
                    while   @@fetch_Status=0  
                      Begin  
                              --Set   @Code=@Code+'-'+convert(varchar(8),@NewOrderID)  
                              --update   tempOrders   use   corresponding   Orders'   data  
                                Update   tmpOrders   set   customerID=@newCustomerID    
                                          where   current   of   #cur_tmpOrders    
                                --pay   attention   to   sequence   of   cursor   fetch   action!  
                                fetch   next   from   #cur_tmpOrders   into   @DummyInt,@dummyChar  
                                if   @@fetch_Status<>0     break;   --   没有行了  
                                fetch   next   from   #cur_orders   into   @newOrderID,@NewCustomerID  
                      End  
   
                  close   #cur_Orders  
                  close   #cur_tmpOrders  
   
                  Deallocate   #cur_Orders  
                  Deallocate   #cur_tmpOrders  
                  Set   @Code='Ok'  
                  return  
           
      End  



程序如下  
          try{  
              Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");  
              String   url=  
  "jdbc:microsoft:sqlserver://192.168.0.102:1433;DatabaseName=Northwind";  
              String   user="sa";  
              String   password="";  
              Connection   conn=   DriverManager.getConnection(url,user,password);  
              CallableStatement   stmt=conn.prepareCall("exec   test     ?,?,?");  
              stmt.setInt(1,10248);  
              stmt.setInt(2,10284);  
              stmt.registerOutParameter(3,Types.VARCHAR,1000);  
              stmt.setString(3,ret);  
              stmt.executeUpdate();  
              System.out.println(stmt.getString(3));  
              stmt.close();  
              stmt=null;  
              conn.close();  
              conn=null;  
          }catch(ClassNotFoundException   e){  
              e.printStackTrace();  
          }catch(SQLException   e){  
              e.printStackTrace();  
          }  


分享到:
评论

相关推荐

    SqlServer存储过程及调试指南

    6. 存储过程修改与变更:在对SQLServer存储过程进行修改和变更时,可能会遇到与现有数据库函数冲突的问题,需要掌握正确的方法来进行升级和批量修改,避免造成错误。 7. 异常处理的详细机制:在TRY块中包含潜在失败...

    SQLServer存储过程中事务的使用方法

    本篇将详细介绍如何在SQL Server存储过程中使用事务。 首先,事务有四个基本特性,即ACID(原子性、一致性、隔离性和持久性): 1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会留下...

    SQLServer存储过程调用WebService

    ### SQL Server 存储过程中调用 WebService 的实现方法 #### 一、引言 在企业级应用开发中,Web Service 作为一种标准的接口技术,被广泛用于不同平台之间的服务交互。而在 SQL Server 数据库中直接调用 Web ...

    sqlserver存储过程解密工具

    这就是“sqlserver存储过程解密工具”所解决的问题。 SQL Server存储过程的加密通常是在开发或部署过程中,为了保护知识产权、防止未授权修改或者增加安全性而进行的。然而,在某些情况下,比如接手他人项目、排查...

    SQLserver存储过程异常处理.txt

    SQLserver存储过程异常处理

    SQLServer存储过程转为oracle存储过程的工具

    可以将SQL Server存储过程转为oracle存储过程的工具

    Sql Server 存储过程的导出导入.doc

    在SQL Server中,存储过程是一种预编译的SQL语句集合,它允许开发人员封装一组复杂的操作,并在需要时重复调用。存储过程对于数据库管理、数据处理和性能优化具有重要意义。本文主要介绍如何在SQL Server中导出和...

    SQL server存储过程习题,SQL触发器习题.rar

    综上,SQL Server的存储过程和触发器是数据库编程的重要组成部分,掌握它们的使用可以帮助我们更高效地管理和维护数据库。通过做相关的习题,不仅可以巩固理论知识,还能提升实际操作技能。对于初学者而言,从基础...

    sqlserver 存储过程With Encryption加密的解密

    ### SQL Server 存储过程 With Encryption 加密的解密方法 #### 背景与目的 在SQL Server中,为了保护存储过程中的敏感代码或逻辑,可以使用`WITH ENCRYPTION`选项对存储过程进行加密处理。这可以有效防止未经授权...

    sql Server 通用分页存储过程

    sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程

    SQL Server中存储过程比直接运行SQL语句慢的原因

    Parameter sniffing 是指 SQL Server 在执行存储过程时,使用参数的统计信息来优化执行计划,但这种优化方式有时可能会导致执行计划的不正确,从而影响存储过程的执行速度。 在了解这个问题之前,我们通常认为存储...

    执行Sqlserver存储过程返回DataSet

    ### 执行SQL Server 存储过程并返回DataSet 在软件开发过程中,经常需要与数据库进行交互,其中一种常见的场景就是通过调用存储过程来获取数据并处理这些数据。本篇文章将详细探讨如何在C#中执行SQL Server的存储...

    vs中断点测试sqlserver的存储过程

    下面,我们将详细探讨如何在Visual Studio(以下简称VS)环境中进行SQL Server存储过程的中断点测试。 ### 一、准备工作:创建VS项目 在进行中断点测试前,首先需要在VS中创建一个新的项目。这一步骤是基础,确保...

    SQL Server存储过程解密工具

    使用SQL Server存储过程解密工具的过程通常涉及以下步骤: 1. 安装和运行:首先,用户需要下载并安装这个工具,运行ThinkDeCode.exe。 2. 连接数据库:工具会要求用户输入SQL Server的相关连接信息,如服务器名、...

    sql server 2008 存储过程与储发器 详解 书籍

    在SQL Server 2008中,存储过程和触发器是数据库管理中不可或缺的重要组成部分,它们...通过深入学习《SQL Server 2008 存储过程与触发器详解》这本书,读者将能全面理解和掌握这两个概念,从而在实际项目中得心应手。

    在VB6.0中调用SQL Server的存储过程.pdf

    在VB6.0中调用SQL Server的存储过程是VB开发者经常遇到的问题,本文将详细介绍如何在VB6.0中调用SQL Server的存储过程,并对存储过程的优点和使用方法进行了详细的解释。 首先,存储过程是一种封装方法,用于重复...

    SQLserver存储过程与触发器.pdf

    当扩展存储过程加载到 SQL Server 中,它的使用方法与系统存储过程一样。扩展存储过程只能添加到 master 数据库中,其前缀是 xp_。 存储过程的功能特点 存储过程可以实现以下功能: * 接收输入参数并以输出参数的...

    sqlserver的存储过程与 where in 多值参数

    本文将探讨在SQL Server中,存储过程与`WHERE IN`子句结合使用时,处理多值参数的几种方法。 **方法一:拼接SQL字符串并调用`EXEC`** 这是最简单也是最直观的方法。你可以在存储过程中接收一个包含多个值的参数,...

    SQL Server 存储过程与实例

    以下是关于SQL Server存储过程的详细说明: 1. **存储过程的概念** 存储过程Procedure是一系列SQL语句的集合,它们在数据库中以编译好的形式存储,当需要执行时,只需要调用存储过程的名称并传入相应的参数。存储...

Global site tag (gtag.js) - Google Analytics