仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 514|回复: 7
打印 上一主题 下一主题

[学习教程] MYSQL编程:SQLSREVER怎样创立和利用静态游标

[复制链接]
若天明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:46:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你不用花费很多时间和金钱来培训现有的职工,或者去花大价钱雇用那些拥有各种证书的开发者。因为MySQL的维护和管理在很大程度上是“傻瓜型”的。创立|静态|游标
▲创立游标

CREATEPROCEDUREUsp_CreateCursor(@Select_Commandvarchar(8000),@Cursor_ReturnCURSORVARYINGOUTPUT)AS
/*存储历程称号:Usp_CreateCursor
功效形貌:依据指定的SELECT创立一个静态游标
参数形貌:@Select_Command---SELECT语句;@Cursor_Return---要前往的游标变量
思绪:静态游标的关头是不知怎样往机关它的SELECT语句,由于SELECT是个字符串表量,界说时不克不及间接用它,但它能够来历于表。
以是我的目标就是创立一个一致的表,从中取数据不就能够了。建表有必定的语律例则,以是就应当依据栏位列表天生响应的
格局,这个能够从体系表中猎取。关头的成绩是怎样将数据拔出光临时表,我探索出一条语句可
完成这个功效,那就是INSERTINTO<TABLE_NAME>EXECUTE<SQL>,而SQL7.0的匡助未讲。有表无数据就能够创立了。
创立人:康剑平易近
创立日期:2001-07-11
*/
Declare@Select_Command_TempVarchar(8000),---寄存SELECT一时语法
@Table_Listvarchar(255),---寄存表的列表
@Column_Listvarchar(8000),---寄存栏位列表
@Table_Namevarchar(30),---寄存独自表名
@Column_Namevarchar(30),---寄存独自栏位名(但有多是*)
@Column_Syntaxvarchar(8000),---寄存栏位建表时的语法(综合)
@Column_Name_Tempvarchar(30),---寄存栏位称号
@Column_Type_Tempvarchar(30),----寄存栏位范例
@Column_Syntax_Tempvarchar(8000),---寄存栏位建表时的语法(单个)
@Column_Length_Tempint,---寄存栏位长度
@Column_Xprec_Tempint,---寄存栏位精度
@Column_Xscale_Tempint,---寄存栏位小数位数
@From_Posint,---寄存from的地位
@Where_Posint,---寄存where的地位
@Having_Posint,---寄存having的地位
@Groupby_Posint,---寄存groupby的地位
@Orderby_Posint,---寄存orderby的地位
@Temp_Posint,---一时变量
@Column_Countint,---寄存栏位总数
@Loop_Seqint---轮回步进变量

---创立一时表
CreateTable#Test(aint)
---假如传来的SELECT语句不是以select开首,主动修正
IfLeft(Lower(Ltrim(@Select_Command)),6)selectSelect@Select_Command=Select+@Select_Command
---将开首‘SELECT’往失落
Select@Select_Command_Temp=Lower(Ltrim(@Select_Command))
IfLeft(@Select_Command_Temp,6)=selectSelect@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)

If@Where_Pos>0Select@Temp_Pos=@Where_Pos
If@Having_Pos>0And@Having_Pos<@Temp_PosSelect@Temp_Pos=@Having_Pos
If@Groupby_Pos>0And@Groupby_Pos<@Temp_PosSelect@Temp_Pos=@Groupby_Pos
If@Orderby_Pos>0And@Orderby_Pos<@Temp_PosSelect@Temp_Pos=@Orderby_Pos
---取表列表
If@Temp_Pos>0
Begin
Select@Table_List=SUBSTRING(@Select_Command_Temp,@From_Pos+6,@Temp_Pos-@From_Pos-1)
End
Else
Begin
Select@Table_List=SUBSTRING(@Select_Command_Temp,@From_Pos+6,Len(@Select_Command_Temp)-@From_Pos-1)
End

Select@Column_Syntax=
---只列出栏位
Select@Select_Command_Temp=Left(@Select_Command_Temp,@From_Pos-1)
WhileLen(@Select_Command_Temp)>0
Begin
---取逗号地位
Select@Temp_Pos=CHARINDEX(,,@Select_Command_Temp)
---初度取栏位称号
If@Temp_Pos>0
Begin
Select@Column_Name=Left(@Select_Command_Temp,@Temp_Pos-1)
End
Else
Begin
Select@Column_Name=@Select_Command_Temp
End
---取表名和栏位名(多是‘*’)
IfCHARINDEX(.,@Column_Name)>0
Begin
Select@Table_Name=Left(@Column_Name,CHARINDEX(.,@Column_Name)-1)
Select@Column_Name=Right(@Column_Name,Len(@Column_Name)-CHARINDEX(.,@Column_Name))
End
Else
Begin
Select@Table_Name=@Table_List
End

---栏位呈现*
IfCHARINDEX(*,@Column_Name)>0
Begin
Select@Column_Name=
Select@Loop_Seq=1
---取栏位个数
Select@Column_Count=Count(*)
FromSysColumns
WhereId=Object_Id(@Table_name)
While@Loop_Seq<=@Column_Count
Begin
---取栏位称号,栏位范例,长度,精度,小数位
Select@Column_Name_Temp=SysColumns.Name,
@Column_Type_Temp=Lower(SysTypes.Name),
@Column_Length_Temp=SysColumns.Length,
@Column_Xprec_Temp=SysColumns.Xprec,
@Column_Xscale_Temp=SysColumns.Xscale
FromSysColumns,SysTypes
WhereSysColumns.Id=Object_Id(@Table_name)And
SysColumns.Colid=@Loop_SeqAnd
SysColumns.XuserType=SysTypes.XuserType
---构成栏位语法表达式
Select@Column_Syntax_Temp=CaseWhen@Column_Type_TempIn(datetime,image,int)Then@Column_Name_Temp++@Column_Type_Temp
When@Column_Type_TempIn(binary,bit,char,varchar)Then@Column_Name_Temp++@Column_Type_Temp+(+Convert(Varchar(10),@Column_Length_Temp)+)
Else@Column_Name_Temp++@Column_Type_Temp+(+Convert(varchar(10),@Column_Xprec_Temp)+,+Convert(varchar(10),@Column_Xscale_Temp)+)
End
Select@Column_Syntax=@Column_Syntax+@Column_Syntax_Temp+,
Select@Loop_Seq=@loop_Seq+1
End
End
Else
Begin
---取栏位称号
Select@Column_Name_Temp=@Column_Name
---取栏位范例,长度,精度,小数位
Select@Column_Type_Temp=Lower(SysTypes.Name),
@Column_Length_Temp=Isnull(SysColumns.Length,0),
@Column_Xprec_Temp=Isnull(SysColumns.Xprec,0),
@Column_Xscale_Temp=Isnull(SysColumns.Xscale,0)
FromSysColumns,SysTypes
WhereSysColumns.Id=Object_Id(@Table_name)And
SysColumns.Name=@Column_Name_TempAnd
SysColumns.XuserType=SysTypes.XuserType
---构成栏位语法表达式
Select@Column_Syntax_Temp=CaseWhen@Column_Type_TempIn(datetime,image,int)Then@Column_Name_Temp++@Column_Type_Temp
When@Column_Type_TempIn(binary,bit,char,varchar)Then@Column_Name_Temp++@Column_Type_Temp+(+Convert(Varchar(10),@Column_Length_Temp)+)
Else@Column_Name_Temp++@Column_Type_Temp+(+Convert(varchar(10),@Column_Xprec_Temp)+,+Convert(varchar(10),@Column_Xscale_Temp)+)
End
Select@Column_Syntax=@Column_Syntax+@Column_Syntax_Temp+,

End
---处置栏位列表
If@Temp_Pos>0
Begin
Select@Select_Command_Temp=Right(@Select_Command_Temp,Len(@Select_Command_Temp)-@Temp_Pos)
End
Else
Begin
Select@Select_Command_Temp=
End
End
---构成准确的栏位创立语法
Select@Column_Syntax=Left(@Column_Syntax,Len(@Column_Syntax)-1)
---修正一时表的布局
Execute(AlterTable#TestAdd+@Column_Syntax)
Execute(AlterTable#TestDropColumna)
---将SELECT实行的布局集拔出光临时表
InsertInto#Test
Execute(@Select_Command)
---创立游标
Set@Cursor_Return=CURSORLOCALSCROLLREAD_ONLYFOR
Select*
From#Test
---翻开游标
Open@Cursor_Return



▲利用游标

/注:在SELECT中有几项,fetchfrom@cursor_nameinto@cust_id就应当声明几个变量,并且按次和范例必需分歧.*/
declare@cursor_namecursor,
@select_commandvarchar(8000),
@cust_idvarchar(20)
select@select_command=selectcust_idfromso_cust
executeusp_createcursor@select_command,@cursor_nameOUTPUT
fetchfrom@cursor_nameinto@cust_id
while@@fetch_status=0
begin
fetchfrom@cursor_nameinto@cust_id
end
close@cursor_name
deallocatecursor_name

申明:上述代码在MSSSQLSERVER7.0上经由过程。别的数据库只需修正一下抓取栏位及其范例的体系表就能够了。














正如前文所提到的,MySQL易学、易部署、易管理和易维护。
只想知道 该用户已被删除
沙发
发表于 2015-1-19 23:24:11 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
兰色精灵 该用户已被删除
板凳
发表于 2015-1-25 20:49:40 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
admin 该用户已被删除
地板
发表于 2015-2-9 06:15:31 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
乐观 该用户已被删除
5#
发表于 2015-2-27 03:14:50 | 只看该作者
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
若天明 该用户已被删除
6#
 楼主| 发表于 2015-3-8 19:24:07 | 只看该作者
光写几个SQL实在叫无知。
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-16 12:35:01 | 只看该作者
我个人认为就是孜孜不懈的学习
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-22 23:06:26 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-27 21:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表