sql游标只返回一个值

标签 sql cursor sybase

我有三个表,其中一个表由员工 ID 连接。普通的 sql 语句进行连接并在一列中返回三个值 - 但是,我需要将这些值显示为单个字符串,即而不是

Harry Tuttle  
Sam Lowrey  
Jack Lint

我需要返回

Harry Tuttle, Sam Lowrey, Jack Lint

我创建了一个存储过程并使用游标(我的第一次尝试),如下所示。唯一的问题是它执行并返回

Sam Lowrey,

每次执行时。过程看起来像

create procedure sp_ac_temp (@assignmment_id int)
as

/* declare local variables used for fetch */  
declare @advisor_name varchar(100)  
/* cursor to get each advisor name */  
declare advisor_fetch cursor for  
        select e.first_name + ' ' + e.last_name + ', '  
          from assign a  
    inner join advisor fa on a.assignment_id = fa.assignment_id  
    inner join employee e on fa.employee_id = e.employee_id  
  where a.assignment_id = @assignmment_id  

open advisor_fetch   
fetch advisor_fetch  
        into @advisor_name   
if (@@sqlstatus = 2)  
begin  
    close advisor_fetch  
    return  
end  


/* if cursor result set is not empty, process each row of information */  
while (@@sqlstatus = 0) 
begin  
    --if (@advisor_name != NULL)  
    begin  
        select @advisor_name = @advisor_name + '! '  

    end   
    fetch advisor_fetch into @advisor_name  

    select @advisor_name  

end  

我可以更改脚本并在不同的 SquirrleSQL Pane 上生成输出,例如,如果我将 while 循环段更改为:

while (@@sqlstatus = 0)
begin
    --if (@advisor_name != NULL)
    begin
        select @advisor_name = @advisor_name + '! '
        select @advisor_name --this here
    end 
    fetch advisor_fetch into @advisor_name

    select @advisor_name

end

这表明光标循环了 6 次(我生成了 6 个 IDE 框架,每个框架都包含一个名称,但它们各不相同:

Harry Tuttle, !
Sam Lowrey,  
Sam Lowrey, ! 
Jack Lint, 
Jack Lint, 
Jack Lint, ! 

))。

我正在使用 Sybase。有什么想法吗?

最佳答案

您不断覆盖您的 @advisor_name 变量。您需要将答案累积到不同的变量中,此处为 @combined_name

我不了解 sybase,但我还假设您需要在使用游标后关闭/取消分配它。

create procedure sp_ac_temp (@assignmment_id int) as
declare @advisor_name varchar(100)  
declare @combined_name varchar(1000) -- variable to accumulate answer

select @combined_name = ''

declare advisor_fetch cursor for  
    select 
        e.first_name + ' ' + e.last_name + ', '  
    from 
        assign a inner join 
        advisor fa on a.assignment_id = fa.assignment_id inner join 
        employee e on fa.employee_id = e.employee_id  
    where
        a.assignment_id = @assignmment_id  

open advisor_fetch   
fetch advisor_fetch into @advisor_name   
if (@@sqlstatus = 2)  
begin  
    close advisor_fetch  
    return  
end  

/* if cursor result set is not empty, process each row of information */  
while (@@sqlstatus = 0) 
begin  
    select @combined_name = @combined_name + @advisor_name --append next advisor
    fetch advisor_fetch into @advisor_name  
end  
select @combined_name

关于sql游标只返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19170147/

相关文章:

sql - PLS-00382 : expression is of wrong type in Oracle cursor

c++ - Qt - QTextStream - 如何将光标位置设置为一行的开头?

java - 无法通过 jconn4.jar/Sybase 驱动程序版本 7 和 Mybatis 框架更新 Sybase 数据库中的多条记录

key - Sybase 删除主键

mysql - 在这种情况下如何避免 -1

mysql - 使用 WHERE 和 AND 参数的 LEFT JOIN

java - 使用字符串进行动态转换

sql - 如何将正数和负数分成各自的列?

mysql - 使用ID从数据库获取数据时使用TOP、Limit

mysql - rlike 表达式或替代查询中的性能?