T-Sql 游标未继续获取

标签 t-sql cursors

我知道游标是不受欢迎的,并且我尝试尽可能避免使用它们,但可能有一些合法的理由使用它们。我有一个,我正在尝试使用一对游标:一个用于主表,一个用于辅助表。主表游标在外循环中迭代主表。辅助表游标在内循环中迭代辅助表。 问题是,主表游标虽然显然在继续并将主键列值 [Fname] 保存到局部变量 @Fname 中,但它没有获取辅助表中相应外键列的行。对于辅助表,它始终返回外键列值与主表第一行的主键列值匹配的行。

以下是我想要在实际存储过程中执行的操作的一个非常简单的示例。 名称是主表

SET NOCOUNT ON
DECLARE 
    @Fname varchar(50) -- to hold the fname column value from outer cursor loop
    ,@FK_Fname varchar(50) -- to hold the fname column value from inner cursor loop
    ,@score int
;

--prepare primary table to be iterated in the  outer loop
DECLARE @Names AS Table (Fname varchar(50))
INSERT @Names
    SELECT 'Jim' UNION
    SELECT 'Bob' UNION
    SELECT 'Sam' UNION
    SELECT 'Jo' 


--prepare secondary/detail table to be iterated in the inner loop
DECLARE @Scores AS Table (Fname varchar(50), Score int)
INSERT @Scores
    SELECT 'Jo',1 UNION
    SELECT 'Jo',5 UNION
    SELECT 'Jim',4 UNION
    SELECT 'Bob',10 UNION
    SELECT 'Bob',15 

--cursor to iterate on the primary table in the outer loop
DECLARE curNames CURSOR
FOR SELECT Fname FROM @Names


OPEN curNames
FETCH NEXT FROM curNames INTO @Fname

--cursor to iterate on the secondary table in the inner loop
DECLARE curScores CURSOR
FOR 
    SELECT FName,Score 
    FROM @Scores 
    WHERE Fname = @Fname 
 --*** NOTE: Using the primary table's column value @Fname from the outer loop

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT 'Outer loop @Fname = ' + @Fname

    OPEN curScores
    FETCH NEXT FROM curScores INTO @FK_Fname, @Score

    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT ' FK_Fname=' + @FK_Fname + '. Score=' + STR(@Score)
        FETCH NEXT FROM curScores INTO @FK_Fname, @Score
    END
    CLOSE curScores
    FETCH NEXT FROM curNames INTO @Fname
END

DEALLOCATE curScores

CLOSE curNames
DEALLOCATE curNames

这是我得到的结果。请注意,对于外部循环,它确实显示最新的 Fname,但是当该 Fname 用作 @Fname 从辅助表中获取相关行以进行后续迭代时,它仍然会获取与第一个迭代匹配的行主表的行 (Bob)。

Outer loop @Fname = Bob
    FK_Fname=Bob. Score=10
    FK_Fname=Bob. Score=15
Outer loop @Fname = Jim
    FK_Fname=Bob. Score=10
    FK_Fname=Bob. Score=15
Outer loop @Fname = Jo
    FK_Fname=Bob. Score=10
    FK_Fname=Bob. Score=15
Outer loop @Fname = Sam
    FK_Fname=Bob. Score=10
    FK_Fname=Bob. Score=15

请让我知道我做错了什么。 提前致谢!

最佳答案

@fName 的值是在 :DECLARE curScores CURSOR 处计算的,而不是在主循环中计算的。 您必须在主循环中声明并释放第二个游标。

关于T-Sql 游标未继续获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/244001/

相关文章:

sql - 帮助用更好的代码替换这个 SQL 游标

sql - 对象名称无效 'Table_2'

sql - 我是否需要递归 CTE 来更新依赖于自身的表?

sql - 连接按列分组的值

sql-server - 当输入参数为空时打印错误消息并终止程序

mysql - 列数不断变化的动态创建语句的存储过程

sql-server - SQL Server 游标引用(语法等)

sql - SQL查询不同列的数据控制

tsql - 循环遍历数据库时出现不一致的游标结果

mysql - 为什么我的嵌套光标显示两倍的结果?