当前位置:首页 » 编程语言 » tsql游标
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

tsql游标

发布时间: 2022-09-19 19:46:04

‘壹’ 什么是游标使用游标的基本步骤是什么

游标(cursor)是系统为用户开设的一个数据缓冲区,存放sql语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。游标提供了一种对从表中检索出的数据进行操作的灵活手段。
使用游标的基本步骤:
1、声明游标。把游标与T-SQL语句的结果集联系起来。
2、打开游标。
3、使用游标操作数据。
4、关闭游标。
功能:
1、游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
2、游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
3、游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
种类:
1、Transact_SQL游标
Transact_SQL游标是由DECLARECURSOR语法定义、主要用在Transact_SQL脚本存储过程和触发器中。Transact_SQL游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL语句或是批处理、存储过程、触发器中的Transact_SQL进行管理。Transact_SQL游标不支持提取数据块或多行数据。
2、API游标
API游标支持在OLEDB,ODBC以及DB_library中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API游标函数,MSSQLSEVER的OLEDB提供者、ODBC驱动器或DB_library的动态链接库(DLL)都会将这些客户请求传送给服务器以对API游标进行处理。
3、客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API游标和Transact-SQL游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。

‘贰’ sql游标实例!

这是模板。
-- =============================================
-- Create procere with CURSOR OUTPUT Parameters
-- =============================================
-- drop the store procere if it already exists
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = N'<procere_name, sysname, proc_test>'
AND type = 'P')
DROP PROCEDURE <procere_name, sysname, proc_test>
GO

-- create the store procere
CREATE PROCEDURE <procere_name, sysname, proc_test>
<@proc_cursor_name, , @proc_test_cursor> CURSOR VARYING OUTPUT
AS
SET <@proc_cursor_name, , @proc_test_cursor> = CURSOR FOR
<select_statement, , select 1>
OPEN <@proc_cursor_name, , @proc_test_cursor>
GO

-- =============================================
-- example to execute the store procere
-- =============================================
DECLARE <@variable_cursor_name, , @test_cursor_variable> CURSOR

EXEC <procere_name, sysname, proc_test> <@proc_cursor_name, , @proc_test_cursor> = <@variable_cursor_name, , @test_cursor_variable> OUTPUT

WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM <@variable_cursor_name, , @test_cursor_variable>
PRINT 'put user defined code here'
END

CLOSE <@variable_cursor_name, , @test_cursor_variable>

DEALLOCATE <@variable_cursor_name, , @test_cursor_variable>
GO

‘叁’ 数据库游标

1.为何使用游标:
使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
2. 如何使用游标:
一般地,使用游标都遵循下列的常规步骤:
(1) 声明游标。把游标与T-SQL语句的结果集联系起来。 (2) 打开游标。 (3) 使用游标操作数据。 (4) 关闭游标。
3.下面是用法
DECLARE cursor1 cursor /* 声明游标,默认为FORWARD_ONLY游标 */
FOR SELECT * FROM books
OPEN cursor1 /* 打开游标 */
FETCH NEXT from cursor1 /* 读取第1行数据*/
WHILE @@FETCH_STATUS = 0 /* 用WHILE循环控制游标活动 */
BEGIN
FETCH NEXT from cursor1 /* 在循环体内将读取其余行数据 */
END
CLOSE cursor1 /* 关闭游标 */
DEALLOCATE cursor1

‘肆’ sql游标的写法

给你一个游标的写法。
此demo的目地是将游标行的name更新到另一张表的字段中条件是2张表的ID相同

Declare@Idvarchar(20)
Declare@Namevarchar(20)
DeclareCurCursorFor
selectid,namefromtemp1
OpenCur
FetchnextFromCurInto@Id,@Name
While@@fetch_status=0
Begin
UpdatetempSet[c3]=@Namewhere[id]=@Id
FetchNextFromCurInto@Id,@Name
End
CloseCur
DeallocateCur

‘伍’ 用T-sql语句建立表MYT,并使用游标技术显示表中10-20之间的记录,

因为没那么多测试数据﹐我用个数字的来测试吧

就是我会在MYT表里面插入100笔3 的倍数的资料进去﹐然后用游标显示其中第10-20的记录

我用的是变量表﹐如果你要用表就把第一行的注释取消就好了

--CREATETABLEMYT(IDINT)
DECLARE@MYTTABLE(IDINT)
DECLARE@TB2TABLE(IDINT)
DECLARE@IDINT--循环用
DECLARE@SIDINT--临时变量用
SET@ID=3
WHILE@ID<=100
BEGIN
INSERTINTO@MYTVALUES(@ID)
SET@ID=@ID+3
END
SET@ID=0
--游标开始
DECLARETB_TEMPCURSORFORSELECT*FROM@MYT
OPENTB_TEMP
FETCHNEXTFROMTB_TEMPINTO@SID
WHILE@@FETCH_STATUS=0
BEGIN
SET@ID=@ID+1
IF@ID>=10AND@ID<=20
BEGIN
INSERTINTO@TB2VALUES(@SID)
END
FETCHNEXTFROMTB_TEMPINTO@SID
END
CLOSETB_TEMP
DEALLOCATETB_TEMP
--游标结束

SELECT*FROM@TB2

效果如下图﹐显示第10-20条之间的记录

‘陆’ sqlserver 游标有哪些属性

楼上你的,你说的是oracle的,不是sqlserver的
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
1.游标的组成
游标包含两个部分:一个是游标结果集、一个是游标位置。
游标结果集:定义该游标得SELECT语句返回的行的集合。游标位置:指向这个结果集某一行的当前指针。

2.游标的分类
游标共有3类:API服务器游标、Transaction-SQL游标和API客户端游标。
其中前两种游标都是运行在服务器上的,所以又叫做服务器游标。
API服务器游标
API服务器游标主要应用在服务上,当客户端的应用程序调用API游标函数时,服务器会对API函数进行处理。使用API函数和方法可以实现如下功能:
(1)打开一个连接。
(2)设置定义游标特征的特性或属性,API自动将游标影射到每个结果集。
(3)执行一个或多个Transaction-SQL语句。
(4)使用API函数或方法提取结果集中的行。
API服务器游标包含以下四种:静态游标、动态游标、只进游标、键集驱动游标(Primary key)
静态游标的完整结果集将打开游标时建立的结果集存储在临时表中,(静态游标始终是只读的)。静态游标具有以下特点:总是按照打开游标时的原样显示结果集;不反映数据库中作的任何修改,也不反映对结果集行的列值所作的更改;不显示打开游标后在数据库中新插入的行;组成结果集的行被其他用户更新,新的数据值不会显示在静态游标中;但是静态游标会显示打开游标以后从数据库中删除的行。
动态游标与静态游标相反,当滚动游标时动态游标反映结果集中的所有更改。结果集中的行数据值、顺序和成员每次提取时都会改变。
只进游标不支持滚动,它只支持游标从头到尾顺序提取数据行。注意:只进游标也反映对结果集所做的所有更改。
键集驱动游标同时具有静态游标和动态游标的特点。当打开游标时,该游标中的成员以及行的顺序是固定的,键集在游标打开时也会存储到临时工作表中,对非键集列的数据值的更改在用户游标滚动的时候可以看见,在游标打开以后对数据库中插入的行是不可见的,除非关闭重新打开游标。

Transaction-SQL游标
该游标是基于Declare Cursor 语法,主要用于Transaction-SQL脚本、存储过程以及触发器中。Transaction-SQL游标在服务器处理由客户端发送到服务器的Transaction-SQL语句。
在存储过程或触发器中使用Transaction-SQL游标的过程为:
(1)声明Transaction-SQL变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从数据类型隐式转换得到的数据类型。
(2)使用Declare Cursor语句将Transaction-SQL游标与Select语句相关联。还可以利用Declare Cursor定义游标的只读、只进等特性。
(3)使用Open语句执行Select语句填充游标。
(4)使用Fetch Into语句提取单个行,并将每列中得数据移至指定的变量中。注意:其他Transaction-SQL语句可以引用那些变量来访问提取的数据值。Transaction-SQL游标不支持提取行块。
(5)使用Close语句结束游标的使用。注意:关闭游标以后,该游标还是存在,可以使用Open命令打开继续使用,只有调用Deallocate语句才会完全释放。
客户端游标
该游标将使用默认结果集把整个结果集高速缓存在客户端上,所有的游标操作都在客户端的高速缓存中进行。注意:客户端游标只支持只进和静态游标。不支持其他游标。

3.游标的生命周期
游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标。
声明游标是为游标指定获取数据时所使用的Select语句,声明游标并不会检索任何数据,它只是为游标指明了相应的Select 语句。
Declare 游标名称 Cursor 参数
声明游标的参数
(1)Local与Global:Local表示游标的作用于仅仅限于其所在的存储过程、触发器以及批处理中、执行完毕以后游标自动释放。Global表示的是该游标作用域是整个会话层。由连接执行的任何存储过程、批处理等都可以引用该游标名称,仅在断开连接时隐性释放。
(2)Forward_only与Scroll:前者表示为只进游标,后者表示为可以随意定位。默认为前者。
(3)Static、Keyset与Dynamic: 第一个表示定义一个游标,其数据存放到一个临时表内,对游标的所有请求都从临时表中应答,因此,对该游标进行提取操作时返回的数据不反映对基表所作的修改,并且该游标不允许修改。Keyset表示的是,当游标打开时,键集驱动游标中行的身份与顺序是固定的,并把其放到临时表中。Dynamic表示的是滚动游标时,动态游标反映对结果集内所有数据的更改。
(4)Read_only 、Scroll_Locks与Optimistic:第一个表示的是只读游标,第二个表示的是在使用的游标结果集数据上放置锁,当行读取到游标中然后对它们进行修改时,数据库将锁定这些行,以保证数据的一致性。Optimistic的含义是游标将数据读取以后,如果这些数据被更新了,则通过游标定位进行的更新与删除操作将不会成功。
标准游标:
Declare MyCursor Cursor
For Select * From Master_Goods
只读游标
Declare MyCusror Cursor
For Select * From Master_Goods
For Read Only
可更新游标
Declare MyCusror Cursor
For Select * From Master_Goods
For UpDate
打开游标使用Open语句用于打开Transaction-SQL服务器游标,执行Open语句的过程中就是按照Select语句进行填充数据,打开游标以后游标位置在第一行。
打开游标
全局游标:Open Global MyCursor 局部游标: Open MyCursor
读取游标数据:在打开游标以后,使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行。使用Fetch操作,可以使游标移动到下一个记录,并将游标返回的每个列得数据分别赋值给声明的本地变量。
Fetch [Next | Prior | First | Last | Absoluten| Relativen] From MyCursor
Into @GoodsID,@GoodsName
其中:Next表示返回结果集中当前行的下一行记录,如果第一次读取则返回第一行。默认的读取选项为Next
Prior表示返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。
First表示返回结果集中的第一行,并且将其作为当前行。
Last表示返回结果集中的最后一行,并且将其作为当前行。
Absoluten如果n为正数,则返回从游标头开始的第n行,并且返回行变成新的当前行。如果n为负,则返回从游标末尾开始的第n行,并且返回行为新的当前行,如果n为0,则返回当前行。
Relativen如果n为正数,则返回从当前行开始的第n行,如果n为负,则返回从当前行之前的第n行,如果为0,则返回当前行。
关闭游标调用的是Close语句,方式如下:Close Global MyCursor Close MyCursor
释放游标调用的是Deallocate语句,方法如下:Deallocate Glboal MyCursor Deallocate MyCursor

游标实例:
Declare MyCusror Cursor Scroll
For Select * From Master_Goods Order By GoodsID
Open MyCursor
Fetch next From MyCursor
Into @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Select @GoodsCode = Convert(Char(20),@GoodsCode)
Select @GoodsName = Convert(Char(20),@GoodsName)
PRINT @GoodsCode + ':' + @GoodsName
End
Fetch next From MyCursor
Into @GoodsCode,@GoodsName
End
Close MyCursor
Deallocate MyCursor

修改当前游标的数据方法如下:
UpDate Master_Goods Set GoodsName = 'yangyang8848' Where Current Of MyCursor;
删除当前游标行数据的方法如下:
Delete From Master_Goods Where Current Of MyCursor

Select @@CURSOR_ROWS 可以得到当前游标中存在的数据行数。注意:此变量为一个连接上的全局变量,因此只对应最后一次打开的游标。

‘柒’ T-SQL怎么游标下移呢

您是要重新编号,按什么顺序编呢?没说清楚。

假设您还按旧编号顺序排序吧:

1.一个语句即成:
update doctor set falseid=(select count(1) from doctor a where a.falseid <=doctor.id)

当然了,你要不想这么漂亮地解决问题,可以笨笨地使用游标

2.使用游标完成:
select FALSEID INTO #TMP from DOCTOR

declare CURSORNAME cursor for select FALSEID from #TMP ORDER BY FALSEID
DECLARE @FALSEID INT,@NEWID INT
SET @NEWID=1

open CURSORNAME
fetch next from CURSORNAME into @FALSEID
while @@fetch_status=0
begin
UPDATE DOCTOR SET FALSEID=@NEWID WHERE FALSEID=@FALSEID
SET @NEWID=@NEWID+1
fetch next from CURSORNAME into @FALSEID
end
close CURSORNAME
deallocate CURSORNAME

GO

‘捌’ 在数据库中如何用T-SQL语句中的游标将学生表中的出生日期中的年份加1

好像没有写错啊.., 有什么错误信息?

  1. 你该不会把大括号也放在代码里吧?

  2. 加句for update如何?

declarestu_cursorscrollcursor
for
select*fromstudinfo
forupdateof出生日期

‘玖’ SQL游标问题,如何修改SQL语句

1、既然不是删除,是用update的方法,那么你的条件要加上FDeleted=0啊……不然恒存在啊
2、是不是必须要用游标1条一条来循环,如果使用语句批量处理是不是更好?
比如我举个栗子
update a set FDeleted=1
from t_ICItem a
where exists(select * from t_ICItem where FName=a.FName and FModel=a.FModel and FItemID < a.FItemID)

update a set FDeleted=1
from t_Item a

where exists(select * from t_ICItem where FItemID = a.FItemID)

‘拾’ 什么是游标

游标:是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

(10)tsql游标扩展阅读:

游标分类

1、Transact_SQL 游标

Transact_SQL 游标由DECLARE CURSOR 语法定义、主要用在Transact_SQL脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上。

由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。

2、API游标

API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。

3、客户游标

客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。

因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。