数据库:sql2000SELECT AutoID, List_ID, Stor_Syb FROM BillProd where Bill_ID=@i_BillID order by AutoIDdeclare cur_tmp cursor Local FAST_FORWARD for SELECT AutoID, List_ID, Stor_Syb FROM BillProd where Bill_ID=@i_BillID order by AutoID open cur_tmp fetch next from cur_tmp into @PHisID, @BillList_ID, @Stor_Syb while @@FETCH_STATUS=0 beginselect '@Stor_Syb', @Stor_Syb...... fetch next from cur_tmp into @PHisID, @BillList_ID, @Stor_Syb end Close cur_tmp deallocate cur_tmp-----------------------------------------------------------------------运行显示: AutoID List_ID Stor_Syb 2366 618 2(无列名) (无列名) @Stor_Syb 2 (无列名) (无列名) @Stor_Syb 2
--TRY declare cur_tmp cursor FAST_FORWARD for
没2000环境,测试不到.试下: declare cur_tmp cursor STATIC LOCAL FAST_FORWARD for SELECT AutoID, List_ID, Stor_Syb FROM BillProd where Bill_ID=@i_BillID order by AutoID
奇怪,在2005下,经过测试,结果都是一样的。declare cur cursor for...默认就是:declare cur cursor forword_only for... forword_only/scroll 两者只能选其一,前者只能从前往后用next读,后者则无此限制。而declare cur cursor fast_forword for..., fast_forword包含forward_only,read_only的含义, 这意味着该游标只能从前往后用next读,并且不能用于更新底层表的数据。由此,怀疑LZ的错误是业务逻辑导致,或者是2000对这些扩展的语法支持得并不是很好。 建议LZ建立一个更纯净的环境来测试一下。
业务逻辑应该没有问题,因为换成scroll,业务处理结果都是对的
declare cur_tmp cursor Local FAST_FORWARD for 这种是动态游标, 会应用数据变化的内容, 所以可能会导致重复, 如果你要避免这种情况, 定义静态的就可以了 declare cur_tmp cursor Local FAST_FORWARD STATIC for
试下: SQL codedeclare cur_tmp cursor STATIC LOCAL FAST_FORWARD for SELECT AutoID, List_ID, Stor_Syb FROM BillProd where Bill_ID=@i_BillID order by AutoID --------------- 用了FAST_FORWARD,是不能同时使用STATIC的
當資料指標擁有者捲動資料指標時,基底資料表中非索引鍵的變更,不論是資料指標擁有者所進行的變更,或其他使用者所認可的變更,都是可見的。其他使用者的插入便不可見 (無法利用 Transact-SQL 伺服器資料指標來插入)。如果刪除了資料列,試圖提取這個資料列會傳回 @@FETCH_STATUS -2。從資料指標之外更新索引鍵值,類似於先刪除舊資料列,再插入新資料列。含有新值的資料列不可見,試圖提取有舊值的資料列會傳回 @@FETCH_STATUS -2。如果更新是藉由指定 WHERE CURRENT OF 子句透過資料指標執行,新值便可見。
FROM BillProd
where Bill_ID=@i_BillID
order by AutoIDdeclare cur_tmp cursor Local FAST_FORWARD for
SELECT AutoID, List_ID, Stor_Syb
FROM BillProd
where Bill_ID=@i_BillID
order by AutoID
open cur_tmp
fetch next from cur_tmp into @PHisID, @BillList_ID, @Stor_Syb
while @@FETCH_STATUS=0
beginselect '@Stor_Syb', @Stor_Syb...... fetch next from cur_tmp into @PHisID, @BillList_ID, @Stor_Syb
end
Close cur_tmp
deallocate cur_tmp-----------------------------------------------------------------------运行显示:
AutoID List_ID Stor_Syb
2366 618 2(无列名) (无列名)
@Stor_Syb 2 (无列名) (无列名)
@Stor_Syb 2
declare cur_tmp cursor FAST_FORWARD for
declare cur_tmp cursor STATIC LOCAL FAST_FORWARD for
SELECT AutoID, List_ID, Stor_Syb
FROM BillProd
where Bill_ID=@i_BillID
order by AutoID
forword_only/scroll 两者只能选其一,前者只能从前往后用next读,后者则无此限制。而declare cur cursor fast_forword for...,
fast_forword包含forward_only,read_only的含义,
这意味着该游标只能从前往后用next读,并且不能用于更新底层表的数据。由此,怀疑LZ的错误是业务逻辑导致,或者是2000对这些扩展的语法支持得并不是很好。
建议LZ建立一个更纯净的环境来测试一下。
declare cur_tmp cursor Local FAST_FORWARD STATIC
for
http://blog.csdn.net/zjcxc/archive/2007/05/12/1606109.aspx认识静态与动态游标
http://blog.csdn.net/zjcxc/archive/2007/05/12/1606103.aspx游标类型产生的数据检索问题
http://blog.csdn.net/zjcxc/archive/2007/05/12/1605777.aspx
不能这样用吧。FAST_FORWARD 是动态游标,跟STATIC关键字是冲突的,两者只能选一。
试下: SQL codedeclare cur_tmp cursor STATIC LOCAL FAST_FORWARD for
SELECT AutoID, List_ID, Stor_Syb
FROM BillProd
where Bill_ID=@i_BillID
order by AutoID ---------------
用了FAST_FORWARD,是不能同时使用STATIC的
KEYSET指定在開啟資料指標時,修正資料指標中之資料列的成員資格和順序。用來一識別資料列的索引鍵集會建立在 tempdb 的 keyset 資料表中。 附註:
如果查詢所參考的資料表中至少有一個沒有唯一的索引鍵,則索引鍵集資料指標會轉換為靜態資料指標。
當資料指標擁有者捲動資料指標時,基底資料表中非索引鍵的變更,不論是資料指標擁有者所進行的變更,或其他使用者所認可的變更,都是可見的。其他使用者的插入便不可見 (無法利用 Transact-SQL 伺服器資料指標來插入)。如果刪除了資料列,試圖提取這個資料列會傳回 @@FETCH_STATUS -2。從資料指標之外更新索引鍵值,類似於先刪除舊資料列,再插入新資料列。含有新值的資料列不可見,試圖提取有舊值的資料列會傳回 @@FETCH_STATUS -2。如果更新是藉由指定 WHERE CURRENT OF 子句透過資料指標執行,新值便可見。
把order by AutoID 去掉,再測
把order by AutoID 去掉,再測这种还是不对,老样子,还是重复了
如鄒老大改為
FAST_FORWARD應該可以