--关于游标的用法
--定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。
--DECLARE CURSOR 接受基于 SQL-92 标准的语法和使用一组 Transact-SQL 扩展的语法。
/*
@@FETCH_STATUS
返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
返回值 描述
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在。
*/
select * from dep;
--这是定义一个游标
declare @id int, @name varchar(20);
declare dep_cursor cursor for
select depid, depname from dep;
--这是打开游标
open dep_cursor;
fetch next from dep_cursor into @id, @name;
while(@@fetch_status = 0)
begin
--fetch next返回紧跟当前行之后的结果行,并且当前行递增为结果行。如果 FETCH NEXT 为对游标的第一次提取操作,
--则返回结果集中的第一行。NEXT 为默认的游标提取选项。
fetch next from dep_cursor into @id, @name;
print @id;
print @name;
end;
--这是关闭游标
close dep_cursor;
--这是删除游标
deallocate dep_cursor;
--这是一个将游标应用到存储过程的应用
--如果我们要返回一个游标的返回值,那么我们的游标的这个参数必须定义为 cursor varying output
create procedure t1_cursor(@dep_cursor cursor varying output)
as
declare @id int, @name varchar(20);
set @dep_cursor = cursor for select depid,depname from dep;--这句代码是个关键
open @dep_cursor;--这是打开游标
drop procedure t1_cursor;
go
declare @t2_cursor cursor, @id int, @name varchar(20);
exec t1_cursor @t2_cursor output;
fetch next from @t2_cursor into @id, @name;
while(@@fetch_status = 0)
begin
print @id;
print @name;
fetch next from @t2_cursor into @id, @name;
end;
close @t2_cursor;
go
/*sqlser游标一个小例子 问题描述:有以下2张表,
现在希望得到这样的数据表A里的O_Saloary加上表B的A_Salary是当前的总工资,并更新到表A。
你可以用视图来,表连接下就可以。
现在我们考虑下让SQL自己来处理,游标就是很好的方法。
原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理。
1.1游标的概念
游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单
个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。
游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
1.2 游标的优点
从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
2)提供对基于游标位置的表中的行进行删除和更新的能力。
3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。
1.3 游标的使用
讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。
使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。
声明游标
最简单游标声明:DECLARE <游标名>CURSOR FOR<SELECT语句>;
其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
打开游标
非常简单,我们就打开刚才我们声明的游标mycursor
OPEN mycursor
读取数据
FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
参数说明:
NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
INTO @变量名[,…] 把提取操作的列数据放到局部变量中。
列表中的各个变量从左到右与游标结果集中的相应列相关联。
各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
关闭游标
CLOSE mycursor
删除游标
DEALLOCATE mycursor
给出具体的例子:
declare @id nvarchar(20) --定义变量来保存ID号
declare @A float --定义变量来保存值
declare mycursor cursor for select * from tb_c --为所获得的数据集指定游标
open mycursor --打开游标
fetch next from mycursor into @id,@A --开始抓第一条数据
while(@@fetch_status=0) --如果数据集里一直有数据
begin
select tb_b.name,(tb_b.gz + @A) from tb_b where tb_b.id = @id --开始做想做的事(什么更新呀,删除呀)
fetch next from mycursor into @id,@A --跳到下一条数据
end
close mycursor --关闭游标
deallocate mycursor --删除游标
sql2005 判断是否为 数字
sql 判断是否为数字
sql语句中的isnumeric函数是用来判断是否为数字
举例:
select isnumeric(0)
返回值为1
select isnumeric('易心博客')
返回值为0
sql2005 update
update mis.a22 set mis.a22.名称=dm_pdtq.dm from dm_pdtq where dm_pdtq.tqmc=mis.a22.名称
说明,更新a22中的名称字段为dm_pdtq.dm
========================================
说明sqlserver2005分页处理
SELECT * FROM (select ROW_NUMBER() Over(order by bh) as rowNum, *
from Table1) as table1
where rowNum> 0 and rowNum<=50 (查询第1页到50页)
说明:复制表(只复制结构,源表名:a 新表名:b)
A:select * into b from a where 1<>1
B:select top 0 * into b from a
说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的
*/
更多信息请查看IT技术专栏