I have a legacy code which used a Table called MyTable which **has only 6 records**.
Here is SQl code:
USe MyDatabase
GO
DECLARE @ANubmer as Varchar(100)
DECLARE @BNumber as Varchar(100)
DECLARE MyCursor CURSOR FOR
SELECT Anumber,BNumber
FROM MyTable
ORDER BY
s.ANumber,date1
OPEN SurveyCursor
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber
select 'CID='+@ANumber+' Avatar='+ @BNubmer
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber
select 'CID='+@ANumber+' Avatar='+ @BNubmer
END
问题在于代码返回7行。
答案 0 :(得分:6)
把第二个' FETCH'在'下方选择'循环中的语句。 从本质上讲,它应该是'中的最后一句话。循环。
同样......抛弃第一个选择语句。你应该把所有东西放在一个循环中。
抓取 - >而 - >选择 - >取
WHILE @@FETCH_STATUS = 0
BEGIN
select 'CID='+@ANumber+' Avatar='+ @BNubmer
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber
END
更正完整脚本
USe MyDatabase
GO
DECLARE @ANubmer as Varchar(100)
DECLARE @BNumber as Varchar(100)
DECLARE MyCursor CURSOR FOR
SELECT Anumber,BNumber
FROM MyTable
ORDER BY
s.ANumber,date1
OPEN SurveyCursor
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber
WHILE @@FETCH_STATUS = 0
BEGIN
select 'CID='+@ANumber+' Avatar='+ @BNubmer
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber
END
建议的优化
关闭/取消分配
USe MyDatabase
GO
DECLARE @ANubmer as Varchar(100)
DECLARE @BNumber as Varchar(100)
DECLARE MyCursor CURSOR FOR
SELECT Anumber,BNumber
FROM MyTable
ORDER BY
s.ANumber,date1
OPEN SurveyCursor
GOTO FetchNext;
WHILE @@FETCH_STATUS = 0
BEGIN
select 'CID='+@ANumber+' Avatar='+ @BNubmer
FetchNext:
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber
END
CLOSE MyCursor
DEALLOCATE MyCursor
答案 1 :(得分:1)
为什么不简单地执行Select,它将返回游标返回的确切内容,但速度会快得多。
一个简单的选择看起来像......
select 'CID='+ CAST(Anumber AS VARCHAR(100)) + ' Avatar='+ CAST(BNumber AS VARCHAR(100))
FROM MyTable
ORDER BY ANumber , date1
为了处理空值,我会做类似的事情......
select 'CID=' + CAST(ISNULL(Anumber,'No value') AS VARCHAR(100))
+ ' Avatar='+ CAST(ISNULL(BNumber,'No value') AS VARCHAR(100))
FROM MyTable
ORDER BY ANumber , date1