临时表+循环+游标的小例子
游标:
参数
- NEXT
-
紧跟当前行返回结果行,并且当前行递增为返回行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。
- PRIOR
-
返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。
- FIRST
-
返回游标中的第一行并将其作为当前行。
- LAST
-
返回游标中的最后一行并将其作为当前行。
- ABSOLUTE { n | @nvar}
-
如果 n 或 @nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为负,则返回从游标末尾开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则不返回行。n 必须是整数常量,并且 @nvar 的数据类型必须为 smallint、tinyint 或 int。
- RELATIVE { n | @nvar}
-
如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则返回当前行。在对游标进行第一次提取时,如果在将 n 或 @nvar 设置为负数或 0 的情况下指定 FETCH RELATIVE,则不返回行。n 必须是整数常量,@nvar 的数据类型必须为 smallint、tinyint 或 int。
- GLOBAL
-
指定 cursor_name 是指全局游标。
- cursor_name
-
要从中进行提取的打开的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称,那么指定 GLOBAL 时,cursor_name 指的是全局游标;未指定 GLOBAL 时,cursor_name 指的是局部游标。
- @ cursor_variable_name
-
游标变量名,引用要从中进行提取操作的打开的游标。
- INTO @variable_name[ ,...n]
-
允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。变量的数目必须与游标选择列表中的列数一致。

如果 SCROLL 选项未在 ISO 样式的 DECLARE CURSOR 语句中指定,则 NEXT 是唯一支持的 FETCH 选项。如果在 ISO 样式的 DECLARE CURSOR 语句中指定了 SCROLL 选项,则支持所有 FETCH 选项。
如果使用 Transact-SQL DECLARE 游标扩展插件,则应用下列规则:
- 如果指定了 FORWARD_ONLY 或 FAST_FORWARD,则 NEXT 是唯一受支持的 FETCH 选项。
- 如果未指定 DYNAMIC、FORWARD_ONLY 或 FAST_FORWARD 选项,并且指定了 KEYSET、STATIC 或 SCROLL 中的某一个,则支持所有 FETCH 选项。
- DYNAMIC SCROLL 游标支持除 ABSOLUTE 以外的所有 FETCH 选项。
@@FETCH_STATUS 函数报告上一个 FETCH 语句的状态。相同的信息记录在由 sp_describe_cursor 返回的游标中的 fetch_status 列中。这些状态信息应该用于在对由 FETCH 语句返回的数据进行任何操作之前,以确定这些数据的有效性。有关详细信息,请参阅 @@FETCH_STATUS (Transact-SQL)。
临时表+循环+游标的小例子
declare @BrandID int set @BrandID=20002 SELECT [ProductID] ,[BrandID] ,[ParentProductID] ,[ParentPath] ,[ProductName] ,[ProductSearchName] ,[ProductDescript] ,[CreateDate] ,[ProductState] ,[ProductType] ,[ProductOrder] ,[Module_ID] ,[msrepl_tran_version] FROM [iWOMTrackData].[dbo].[IWT_BrandProduct] where BrandID=@BrandID and ParentProductID=0 --临时存储 DECLARE @TempProductTable TABLE (ProductName varchar(100) ) INSERT @TempProductTable (ProductName) (SELECT DISTINCT [ProductName] FROM [iWOMTrackData].[dbo].[IWT_BrandProduct] where BrandID=@BrandID and ParentProductID=0) SELECT * FROM @TempProductTable --循环将行变成列 declare @i int,@total int declare @Temp table (id int) set @i=1 select @total=COUNT (1) from @TempProductTable while @i<@total begin set @i=@i+1 end print @i --游标 declare @columnName varchar(100)--定义存放数据的变量 declare cur cursor--定义一个游标 read_only for select ProductName from @TempProductTable--为所获得的数据集指定游标 open cur--打开游标 fetch next from cur into @columnName--把提取操作的列数据放到局部变量中 while(@@fetch_status=0)--返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。 begin select @columnName--具体的操作 fetch next from cur into @columnName----提取下一位信息 end close cur--关闭游标 deallocate cur--删除游标