我的场景有点不同。 我在存储过程中执行的操作是
创建临时表并使用"光标"在其中插入行
Create Table #_tempRawFeed
(
Code Int Identity,
RawFeed VarChar(Max)
)
使用光标在临时表中插入数据
Set @GetATM = Cursor Local Forward_Only Static For
Select DeviceCode,ReceivedOn
From RawStatusFeed
Where C1BL=1 AND Processed=0
Order By ReceivedOn Desc
Open @GetATM
Fetch Next
From @GetATM Into @ATM_ID,@Received_On
While @@FETCH_STATUS = 0
Begin
Set @Raw_Feed=@ATM_ID+' '+Convert(VarChar,@Received_On,121)+' '+'002333'+' '+@ATM_ID+' : Bills - Cassette Type 1 - LOW '
Insert Into #_tempRawFeed(RawFeed) Values(@Raw_Feed)
Fetch Next
From @GetATM Into @ATM_ID,@Received_On
End
现在必须使用另一个游标处理临时表中的每一行
DECLARE @RawFeed VarChar(Max)
DECLARE Push_Data CURSOR FORWARD_ONLY LOCAL STATIC
FOR SELECT RawFeed
FROM #_tempRawFeed
OPEN Push_Data
FETCH NEXT FROM Push_Data INTO @RawFeed
WHILE @@FETCH_STATUS = 0
BEGIN
/*
What Should i write here to retrieve each row one at a time ??
One Row should get stored in Variable..in next iteration previous value should get deleted.
*/
FETCH NEXT FROM Push_Data INTO @RawFeed
END
CLOSE Push_Data
DEALLOCATE Push_Data
Drop Table #_tempRawFeed
我应该在 BEGIN 中写什么才能一次检索一行? 一行应该存储在变量中。在下一次迭代中,应删除以前的值。
关于你的最后一个问题,如果你真正打算在最后一个游标中做的是将 RawFeed 列值连接成一个变量,你根本不需要游标。您可以使用以下内容(改编自您的SQL Fiddle代码):
CREATE TABLE #_tempRawFeed
(
Code Int IDENTITY
RawFeed VarChar(MAX)
)
INSERT INTO #_tempRawFeed(RawFeed) VALUES('SAGAR')
INSERT INTO #_tempRawFeed(RawFeed) VALUES('Nikhil')
INSERT INTO #_tempRawFeed(RawFeed) VALUES('Deepali')
DECLARE @RawFeed VarChar(MAX)
SELECT @RawFeed = COALESCE(@RawFeed + ', ', '') + ISNULL(RawFeed, '')
FROM #_tempRawFeed
SELECT @RawFeed
DROP TABLE #_tempRawFeed
有关将不同的行值连接到单个字符串的更多信息,请参阅此处:将许多行连接成单个文本字符串?
我很确定您也可以避免使用第一个光标。请避免使用光标,因为确实会损害性能。使用基于集合的操作可以实现相同的结果。