zoukankan      html  css  js  c++  java
  • 通用版上移下移存储过程

      今天终于写出一个通用版的上移下移存储过程,表明,主键名,排序字段名等都是动态的,之前写了个针对特殊表的上移下移操作http://www.cnblogs.com/fjsnail/p/3217331.html,显然显得很不灵活。

    在下面的存储过程中,包含了许多写动态存储过程的思想。由于我是新手,尤其是对于动态存储过程(Trans_sql)刚刚接触。接下来一篇写点关于动态存储过程的!顺便总结一下该篇包含的思想!

    USE [WeiGou2]
    GO
    /****** Object:  StoredProcedure [dbo].[Proc_MoveUpOrDown2]    Script Date: 07/30/2013 14:42:38 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    ALTER PROCEDURE [dbo].[Proc_MoveUpOrDown2]
    
    @keyFiled varchar(20), --主键字段
    @keyValue int ,  --主键值(一般是id,并且设置自动增长)
    @orderType as int, --0升序,1降序
    @tabelName as varchar(20), --表明
    @sortField as varchar(20)--排序字段
    
    As
    declare @currentOrderId  int --当前标志Id的排序id
    declare @nextId int --下一个数据标志Id
    declare @nextOrderId  int --下一个数据的排序id
    declare @lastId int --上一个数据的标志Id
    declare @lastOrderId int --上个数据的排序id
    declare @temple varchar(10) --操作过程中varvhar 和int之间的转换 
    declare @maxOrderId int --降序时最大排序Id
    declare @minOrderId int --升序是最小排序id
    
    declare @tempSql varchar(200) --中间sql语句,存放最后执行的sql语句
    declare @tempField varchar(20) --中间sql语句,存放中间变量
    
    Begin
    
    set @tempsql='select '+@sortField+' as t into ##tempTable  from '+@tabelName+ '  where '+@keyFiled+'='+cast(@keyValue  as varchar(3))+''  --选择出当前排序编号
    exec(@tempsql)
    
    select @currentOrderId=t from ##tempTable  --从临时表中选择出排序编号
    drop table ##tempTable  --删除临时表
    
    
    --找出原有数据中最大orderId和最小orderId
    
    set @tempSql='select min('+@sortField+') as minKey ,max('+@sortField+') as maxKey into ##tempTable2  from '+@tabelName  
    exec(@tempSql)
    set @minOrderId= (select minKey from ##tempTable2)
    set @maxOrderId=(select maxKey from ##tempTable2)
    drop  table ##tempTable2
    
    if(@orderType=0)
      Begin   --升序
    
           if(@currentOrderId<>@minOrderId)                     --当前id不等于最小id才有升序资格
           Begin
           
              --查询下一个数据的Id和orderId
           
              set @tempSql='select top 1 '+@keyFiled+' as keyFiled ,'+@sortField+' as sortFiled into ##tempTable3 from '+@tabelName +'  where  '+@sortField+'  <   '+cast(@currentOrderId as varchar(3)) +'  order by   '+@sortField +'  desc'
              exec(@tempSql)
              select @lastId=keyFiled from ##tempTable3
              select @lastOrderId=sortFiled from ##tempTable3
                 
                  --当前orderid的排序编号和上一个对换
                set @tempSql='update  '+@tabelName+' set '+@sortField+'='+ cast(@currentOrderId as varchar(3))+' where '+@keyFiled+'='+cast(@lastId as varchar(3))
                set @tempSql=@tempSql+' update  '+@tabelName+' set '+@sortField+'='+cast(@lastOrderId as varchar(3))+' where '+@keyFiled+'='+cast(@keyValue as varchar(3)) 
                exec(@tempSql)
                
                drop table ##tempTable3    --dorp临时表
           End
      End
     else  --降序
    	 Begin
           if(@currentOrderId<>@maxOrderId)                      --当前id不等于最大id才有升序资格
           
           Begin
              --查询下一个数据的Id和orderId
           
              set @tempSql='select top 1 '+@keyFiled+' as keyFiled ,'+@sortField+' as sortFiled into ##tempTable3 from '+@tabelName +'  where  '+@sortField+'  >   '+cast(@currentOrderId as varchar(3)) +'  order by   '+@sortField +'  asc'
              exec(@tempSql)
              select @nextId=keyFiled from ##tempTable3
              select @nextOrderId=sortFiled from ##tempTable3
                 
                  --当前orderid的排序编号和上一个对换
                set @tempSql='update  '+@tabelName+' set '+@sortField+'='+ cast(@currentOrderId as varchar(3))+' where '+@keyFiled+'='+cast(@nextId as varchar(3))
                set @tempSql=@tempSql+' update  '+@tabelName+' set '+@sortField+'='+cast(@nextOrderId as varchar(3))+' where '+@keyFiled+'='+cast(@keyValue as varchar(3)) 
                exec(@tempSql)
                
                drop table ##tempTable3    --dorp临时表
           End
    	 End
     
    end
    

     使用方法:exec Proc_MoveUpOrDown2 'id',3,1,'tableName,'orderid'

      在sql2008中可以调试存储过程,这无疑给要写非常长的存储过程提供了极大的方便。(查看该片 http://www.cnblogs.com/fjsnail/p/3225382.html)

  • 相关阅读:
    TP5中的小知识
    php中Redis的扩展
    html js css压缩工具 可以实现代码压缩
    Python 基础
    操作系统简介
    计算机硬件
    Linux命令 比较文件
    Linux命令 查看及修改文件属性
    Linux命令 文件备份归档恢复
    Linux命令 文件的建立移动删除
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3225352.html
Copyright © 2011-2022 走看看