Stored procedures 如何在嵌套循环内的sql存储过程中设置变量

Stored procedures 如何在嵌套循环内的sql存储过程中设置变量,stored-procedures,sql-server-2012,nested-loops,Stored Procedures,Sql Server 2012,Nested Loops,在给定存储sql过程的第二个循环中 BEGIN SET NOCOUNT ON; DECLARE @ACounter INT = 1, @AMax INT = 0, @BCounter INT = 1, @BMax INT = 0, @selected_A_Id int, @selected_B_Id int Declare @A TABLE ( [ID] int identity, A_Id int ) Declare

在给定存储sql过程的第二个循环中

BEGIN
    SET NOCOUNT ON;

DECLARE
    @ACounter INT = 1,
    @AMax INT = 0,
    @BCounter INT = 1,
    @BMax INT = 0,
    @selected_A_Id int,
    @selected_B_Id int

Declare @A TABLE (
    [ID] int identity,
    A_Id int
)

Declare @B TABLE (
    [ID] int identity,
    B_Id int
)

INSERT INTO @A (A_Id)
SELECT A_Id FROM Table_A

SELECT @AMax = COUNT(Id) FROM @A

-- Loop A
WHILE @ACounter <= @AMax
BEGIN

    select @selected_A_Id = A_Id FROM @A WHERE ID=@ACounter
    Delete FROM @B;

    INSERT INTO @B (B_Id)
    SELECT B_Id  FROM Table_B WHERE (FK_A_ID = @selected_A_Id)

    SELECT @BMax = COUNT(ID) FROM @B
    set @BCounter = 1

    -- Loop B
    WHILE @BCounter <= @BMax
    BEGIN

        select @selected_B_Id = B_Id FROM @B WHERE ID=@BCounter;
        -- here I want to do something with  @selected_B_Id
        -- but @selected_B_Id gets set to the B_Id of the first record of table B and stays the same
        -- throughout both loops

        SET @BCounter = @BCounter + 1
    END

SET @ACounter = @ACounter + 1
END

END
声明的变量@selected_B_Id应设置为表B中的值,该值由循环a中的记录填充。但由于某些原因,@selected_B_Id的值在两个循环中循环时不会更改

我将@selected_B_Id的声明放在循环B中,但这并没有改变结果

有人能帮我纠正一下吗?

2017年以后被string_agg取代的for xml解决方案如下所示:

declare @person table(pid int, pname varchar(100));
declare @transaction table(pid int, skuid int);
declare @sku table(skuid int, skuname varchar(100));

insert into @person values(1,'Person 1'),(2,'Person 2'),(3,'Person 3')
insert into @transaction values(1,1),(1,2),(1,3),(1,4),(2,2),(2,4);
insert into @sku values(1,'Prod 1'),(2,'Prod 2'),(3,'Prod 3'),(4,'Prod 4'),(5,'Prod 5'),(6,'Prod 6');

select p.pid
      ,p.pname
      ,stuff((select ', ' + s.skuname
              from @transaction as t
                  join @sku as s
                    on t.skuid = s.skuid
              where p.pid = t.pid
              order by s.skuname
              for xml path('')
             ),1,2,'') as ReportField
from @person as p
group by p.pid
        ,p.pname
order by p.pname;
输出
我认为,首先,您应该询问是否有一种解决方案不需要一个循环,更不用说嵌套循环了。这个存储过程实际上在做什么?我有两个相关的表A:B,1:n,我想从表B中的字段收集串联字符串值,并将其放入表A中的字段中。首先,为什么?闻起来这是个糟糕的设计选择。第二,这不需要使用xmlOn循环就可以实现。在我的一个网页上,我想展示一个公司的技术信息摘要—有很多表,它们之间有1:n的关系。将这些信息拉到一个页面中会降低加载速度;由于这些数据没有频繁更改,我想,让后台任务将所有这些“关联”到一个“报告字段”中,然后可以将其加载到页面中。我还发现了以下内容:。连同戴夫的回答,我想我可以继续下去;谢谢
+-----+----------+--------------------------------+
| pid |  pname   |          ReportField           |
+-----+----------+--------------------------------+
|   1 | Person 1 | Prod 1, Prod 2, Prod 3, Prod 4 |
|   2 | Person 2 | Prod 2, Prod 4                 |
|   3 | Person 3 | NULL                           |
+-----+----------+--------------------------------+