数据库

sql语句函数大集合之事务、游标、存储过程及触发器

2011-04-15

mssql

事务的使用:  
1.begin distributed transaction  指定一个事务的起始。  
原型:  
        Begin destributed tran [ saction] [transaction_name! @tran_name_variable]  
例如:  
        Use northwind   
        Begin destributed transaction  //开始一个分布式事务  
        Update empoyees       //对表empolees 进行更新  
        Set firstname=’mcdonald’ where homephone = ‘(206) 555-9875’  
        Commit transaction    //结束事务  
        Go  
2.commit transcation 指明事务结束。  
3.rollback transcation  撒销对数据库作出的所有改变,返回到事务开始之前的状态。  
原型:  
        Rollback [tran [saction] [transaction_name] @tran_name_variable | savepoint_name |  
@savepoint_variable]  
       参数说明:  
        Transadtion 给begin transaction上的事务指派的名称。  
        @tran_name_bariable  用户定义的、含有有效事务名称的变量名称。  
        Savepoint_name  是来自SAVE TRANSACTION语句的svepoint_name。  
        @savepoint_variable 是用户定义的、含有有效保存点名称的变量的名称。  
      例如:  
        Begin transaction royaltychange  //事务开始  
        Update titleauthor  //更新表  
            Set royaltyper = 65   //重设参数  
            From titleauthor,titles   
            Where royaltyper=75   
                And titleauthor.title_id=titles.title_id  
                And title=’The Gourmet Microwave’  
        Update titleauthor  
            Set royaltype = 15  
            From titleauthor, titles  
            Where royaltyper=25  
            And titleauthor.title_id=titles.title_id  
            And title = ‘The Gourmet Microwave’  
        Save transaction percentchanged  //在事务内设置保存点  
        Update titles   
            Set price = price* 1.1  
            Where title =’The Gourmet Microwave’  
        Select (price * royalty * ytd_sales)* royaltyper  
            From titles,titleauthor  
            Where title=’The Gourmet Microwave’  
            And titles.title_id=titleauthor.title_id  
        Rollback transaction percentchanged  //回到先前保存过的保存点  
        Commit transaction   // 事务结束  
4.save transaction  在事务内设置保存点。  
5.commit work  标志事务的结束。  
6.rollback work  将用户的事务回滚到事务的起点。
  
游标的使用:  
1.declare cursor  定义游标结构并分配资源。  
原型:  
    Declate cursor_name [insensitive] [scorll] cursor for select_statement [for { read    
Only | update }[of  column _list]]   
            或者:  
            Declare cursor_name cursor [local | global] [forward_only | scroll] [static | keyset |  
dynamic] [read_only | scroll_locks | optimistic] for [select _statement  
[ for {read only | update } [of column_list]]]  
        参数说明:  
        INSENSITIVE  指明要为检索到的结果集建立一个临时拷贝,以后的数据从这个临时拷贝中获取。原有基表中数据发生了改变,对于游标而言是不可见的。这种不敏感的游标不允许数据更改。  
        SCROLL  指明游标可以在任意方向上滚动。忽略该选项,则游标只能向前滚动。  
        SELECT_SATAEMENT  指明SQL语句建立的结果集。  
        READ ONLY  指明在游标结果集中不允许进行数据更改。  
        UPDATE  指明游标结果集可以进行修改。  
        OF COLUMN_LIST  指明结果集中可以进行修改的列。缺省时(使用UPDATE关键字),所有的列都可进行修改。  
        LOCAL  指明游标是局部的,只能在它所声明的过程中使用。全局的游标在连接激活的任何时候都是可用的。只有池连接结束时,才不再可用。  
        GLOBAL 使用游标对于整个连接全局可见。  
        FORWARD_ONLY  指明游标只能向前滚动。  
        STATIC  与INSENITIVE的游标相同。  
        KEYSET  指明选取的行的顺序。  
        DYNAMIC  指明游标反映所有对结果集的修改。  
        SCROLL_LOCK  对修改或删除加锁。保证游标操作成功。  
        OPTIMISTIC  指明哪些通过游标进行的修改或者删除将不会成功。  
    例如:  
        Use northwind   
        Go   
        Declare customers_cursor cursor    //定义游标  
        For select companyname , address,phone  //选择部分属性  
        From customers   
        Where city=’london’  
        For read only  //只读游标  
        Deallocate customers_cursor   //删除游标  
2.deallocate  删除游标定义,释放资源。  
3.open  打开游标。  
原型:  
    Open { { [global]  cursor_name } | cursor_variable_name }  
    例如:  
        Use northwind   
        Go  
        Declare employee_cursor cursor for   //定义游标  
        Select lastname,firstname   
        From northwind .dbo.employees   
Where firstname like ‘m%’  
Open employee_cursor   // 打开游标  
Fetch next from employee_cursor   //利用游标提取数据  
While @@fetch_status=0   //当利用FETCH提取数据成功时,运用循环提取下一条数据  
Begin   //循环体开始处  
    Fetch next from employee_cursor  
End    //循环体结束  
close employee_cursor    //关闭游标  
Deallocate employee_cursor   // 释放游标  
4.close  关闭游标并释放结果集。  
5.fetch  通过游标从结果集中取值。  
     原型:  
        Fetch [next | prior | first | last | absolute {n | @nvar} | relative {n | @nvar}] from [global]  
             Cursor_name} | cursor_variable_name } [into @variable_name ] [,……n]  
    参数说明:  
        NEXT  指明从当前的行的下一行取值。  
        PRIOR  指明人当前行的前一行取值。  
     &n, bsp;  FIRST  结果集的第一行。  
        LAST   结果集的最后一行。  
        ABSOLUTE  n表示结果集中的第n行。该行数同样可以通过一个局部变量传播。  
        RELATIVE  n表示要取出折行在当前的前n行或后n行的位置上。如果该值为正数则要取出的行在当前行前n行的位置上,如果该值为负数,则返回当前行的后n行。  
        INTO @cursor_variable_name  表示游标列值存储的地方的变量列表。变量的数据类型也应该与被选择列的数据类型相同。直到下一次使用FETCH语句之前,变量中的值都会一直保持。  
    函数返回值:  
        利用@@FETCH_STATUS返回FETCH状态。  
        0:FETCH 成功。  
        1:FETCH 失败或超出设置范围。  
        2:提取的数据行丢失。  
    例如:  
        Open employee_cursor  
        Fetch next from employee_cursor  
        While @@fetch_status = 0   
        Begin   
        Fetch next from employee_cursor  
        End       
        Close employee_curssor
  
存储过程的使用:  
1.create procedure  创建存储过程。  
原型:  
        Create proc [edure] procedure_name [; number]  
        [{@parameter data_type} [varying] [ = default] [output]] [,…n]  
        [ with {recomple | enplication | recompile , encryption }] [for replication]  
        As sql_statement […n]  
    参数说明:  
        Procedure_name  新存储的过程。对于数据库及其所有者必须惟一。创建局部临时过程,在procedure_nameu前加一个编号符#;创建全局临时过程,在procedure_nameu前加两个编号符##。完整的名称不能超过128个字符。  
        Number  对同名的过程分组。  
        @parameter  过程中的参数。  
        Data_type  参数的数据类型。除table之外的其他所有数据类型均可以用伯存储过程的参数。Cursor数据类型只能用于output参数。