这是游标的合适情况吗?

Dav*_*ein 1 t-sql sql-server-2000

我有以下脚本:

SELECT left(SHI.FSOKEY, 6) AS [SoNo]
,      substring(SHI.FSOKEY, 7, 3) AS [So Item]
,      right(SHI.FSOKEY, 3) AS [So Rels]
,      QAL.FCLOT AS [LotSerial]

FROM shmast SHM
     INNER JOIN shitem SHI
     ON SHM.FSHIPNO = SHI.FSHIPNO
     INNER JOIN qalotc QAL
     ON SHM.FSHIPNO = Left(QAL.FCUSEINDOC, 6)
        AND substring(QAL.FCUSEINDOC, 7, 6) = SHI.FITEMNO
Run Code Online (Sandbox Code Playgroud)

这会产生如下所示的输出:

SoNo      So Item  SoRels  LotSerial
123456      1      001     ABCD
123456      1      001     AMOH
123456      1      001     POWK
123456      1      001     IUIL
123456      1      002     ABCE
Run Code Online (Sandbox Code Playgroud)

我想按SoNo,SoItem,SoRels分组并获得每个LotSerial的列表.所以,我的输出看起来像这样:

SoNo      So Item  SoRels  LotSerial
123456      1      001     ABCD, AMOH, POWK, IUIL
123456      1      002     ABCE
Run Code Online (Sandbox Code Playgroud)

我需要这样做,我可以将此信息提取回基于SoNo,SoItem,SoRels的主查询.

任何帮助将不胜感激.

cms*_*sjr 5

一如既往,尽可能避免使用游标.您的场景非常适合用户定义的功能.我为这个例子简化了你的模式.本质上,我们将与逗号匹配的序列连接到用户定义函数中的变量,然后重新调整结果.如果可以使用Null值,则可能需要添加Coalesce的使用

create table SO (SONO int)
insert into SO values (1)
insert into SO values (2)
insert into SO values (3)


create table SOCHILD 
(SONO int, SerialNo varchar(10))
insert into SOCHILD values (1, 'ABCD')
insert into SOCHILD values (1, 'EFGH')
insert into SOCHILD values (1, 'IJKL')
GO
create function fx_GetSerials(@SONO int)
returns varchar(1000) as
Begin
    Declare @ret varchar(1000)
    set @ret = ''
    Select @ret = @ret + SerialNo + ','
    from SOCHILD where SONO = @SONO
    if (len(@ret) > 0) 
        set @Ret = left(@ret, len(@ret) -1)
    return @ret 
End 
GO
select dbo.Fx_GetSerials(1)
drop function fx_GetSerials 
Drop table SO
Drop table SOCHILD
Run Code Online (Sandbox Code Playgroud)

结果ABCD,EFGH,IJKL