日期:2014-02-06  浏览次数:20398 次

▲创建游标www.come on babyiTbulo.comnsE3q

CREATE PROCEDURE Usp_CreateCursor(@Select_Command varchar(8000),@Cursor_Return CURSOR VARYING OUTPUT) AS


/*存储过程名称:Usp_CreateCursor
  功能描述:    根据指定的SELECT创建一个动态游标
  参数描述:    @Select_Command ---SELECT语句;@Cursor_Return ---要返回的游标变量
  思路:        动态游标的关键是不知如何去构造它的SELECT语句,因为SELECT是个字符串表量,定义时不能直接用它,但它可以来源于表。
                所以我的目的就是创建一个统一的表,从中取数据不就可以了。建表有一定的语法规则,所以就应该根据栏位列表生成相应的
                格式,这个可以从系统表中获取。关键的问题是如何将数据插入到临时表,我摸索出一条语句可
                实现这个功能,那就是INSERT INTO <TABLE_NAME> EXECUTE <SQL>,而SQL7.0的帮助未讲。有表有数据就可以创建了。
  创建人:      康剑民
  创建日期:    2001-07-11
*/
Declare @Select_Command_Temp Varchar(8000), ---存放SELECT临时语法
        @Table_List varchar(255), ---存放表的列表
        @Column_List varchar(8000),---存放栏位列表
        @Table_Name varchar(30),---存放单独表名
        @Column_Name varchar(30),---存放单独栏位名(但有可能是*)
        @Column_Syntax varchar(8000),---存放栏位建表时的语法(综合)
        @Column_Name_Temp varchar(30),---存放栏位名称
        @Column_Type_Temp varchar(30),----存放栏位类型
        @Column_Syntax_Temp varchar(8000),---存放栏位建表时的语法(单个)
        @Column_Length_Temp int,---存放栏位长度
        @Column_Xprec_Temp int,---存放栏位精度
        @Column_Xscale_Temp int,---存放栏位小数位数
        @From_Pos int,---存放from的位置
        @Where_Pos int,---存放where的位置
        @Having_Pos int,---存放having的位置
        @Groupby_Pos int,---存放groupby的位置
        @Orderby_Pos int,---存放orderby的位置
        @Temp_Pos int,---临时变量
        @Column_Count int,---存放栏位总数
        @Loop_Seq int---循环步进变量www.come on babyiTbulo.comnsE3q

---创建临时表
Create Table #Test(a int)
---如果传来的SELECT语句不是以'select'开头,自动修改
If Left(Lower(Ltrim(@Select_Command)),6) <> 'select' Select @Select_Command = 'Select ' + @Select_Command
---将开头‘SELECT’去掉
Select @Select_Command_Temp = Lower(Ltrim(@Select_Command))
If Left(@Select_Command_Temp,6) = 'select' Select @Select_Command_Temp = Right(@Select_Command_Temp,Len(@Select_Command_Temp) - 7)
---取各保留字位置,以便获得表的列表
Select @From_Pos = CHARINDEX(' from ',@Select_Command_Temp)
Select @Where_Pos = CHARINDEX(' where ',@Select_Command_Temp)
Select @Having_Pos = CHARINDEX(' having ',@Select_Command_Temp)
Select @Groupby_Pos = CHARINDEX(' groupby ',@Select_Command_Temp)
Select @Orderby_Pos = CHARINDEX(' orderby ',@Select_Command_Temp)www.come on babyiTbulo.comnsE3q

If @Where_Pos > 0 Select @Temp_Pos = @Where_Pos
If @Having_Pos > 0 And @Having_Pos < @Temp_Pos Select @Temp_Pos = @Having_Pos
If @Groupby_Pos > 0 And @Groupby_Pos < @Temp_Pos Select @Temp_Pos = @Groupby_Pos
If @Orderby_Pos > 0 And @Orderby_Pos < @Temp_Pos Select @Temp_Pos = @Orderby_Pos
---取表列表
If @Temp_Pos > 0
   Begin
   Select @Table_List = SUBSTRI