如何遍历 SQL 服务器数据透视查询
How to loop through SQL Server pivot query
在开始阅读之前,如果下面的解释太长,您将不会阅读下面的代码。
请您覆盖它,只看最后一行。
我有这个使用游标的正常循环查询,效果很好。
DECLARE db_cursor CURSOR FOR
Select top 100 percent
[students].stu_id as StuID, Major_ID,MajorSeq,
SysDate, Points
From
[dbo].[StudentRegsterations]
inner join
[dbo].[students] on [dbo].[StudentRegsterations].Stu_ID = [dbo].[students].stu_id
order by
[Points] desc, [SysDate] desc;
DECLARE @StuID [int];
DECLARE @Major_ID [int];
DECLARE @MajorSeq [int];
DECLARE @SysDate [date];
DECLARE @Points [decimal](10, 2);
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points;
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff with scalar values
--InsertThisStudent()
print CAST(@Points as varchar(10)) + ' - ' + CAST(@SysDate as varchar(20))
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
以上循环查询抛出正常选择。
但是,如果我将其更改为数据透视查询,则会出现以下错误。
Msg 16924, Level 16, State 1, Line 31
Cursorfetch: The number of variables declared in the INTO list must match that of selected columns.
导致错误的数据透视查询是这样的。
DECLARE db_cursor CURSOR FOR
SELECT *
FROM
(Select top 100 percent
[students].stu_id as StuID, SysDate, Points, MajorSeq, Major_ID
From
[dbo].[StudentRegsterations]
inner join
[dbo].[students] on [dbo].[StudentRegsterations].Stu_ID = [dbo].[students].stu_id) WorkOrders
PIVOT
(
max(Major_ID)
FOR [MajorSeq] IN (
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
[11],[12],[13],[14],[15],[16],[17],[18],[19],[20]
)
) AS PivotTable
order by [Points] desc,[SysDate] desc
DECLARE @StuID [int];
DECLARE @Major_ID [int];
DECLARE @MajorSeq [int];
DECLARE @SysDate [date];
DECLARE @Points [decimal](10, 2);
DECLARE @1 [int];DECLARE @2 [int];DECLARE @3 [int];DECLARE @4 [int];DECLARE @5 [int];DECLARE @6 [int];DECLARE @7 [int];
DECLARE @8 [int];DECLARE @9 [int];DECLARE @10 [int];DECLARE @11 [int];DECLARE @12 [int];DECLARE @13 [int];DECLARE @14 [int];
DECLARE @15 [int];DECLARE @16 [int];DECLARE @17 [int];DECLARE @18 [int];DECLARE @19 [int];DECLARE @20 [int];
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points,
@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20;
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff with scalar values
--InsertThisStudent()
print CAST(@Points as varchar(10)) + ' - ' + CAST(@SysDate as varchar(20))
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points, @1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
简述所有我想要的,使用任何 SQL 服务器方式循环数据透视查询,使用任何小查询样本,未提交我的代码。
将数据透视查询的结果保存到临时 table(使用 INTO #TempTable
)并循环 #TempTable。
编辑。但是,它也应该适用于您的代码。也许尝试 CLOSE db_cursor
并再次执行它。我认为您已经有了导致问题的 db_cursor 的一些定义。
在开始阅读之前,如果下面的解释太长,您将不会阅读下面的代码。
请您覆盖它,只看最后一行。
我有这个使用游标的正常循环查询,效果很好。
DECLARE db_cursor CURSOR FOR
Select top 100 percent
[students].stu_id as StuID, Major_ID,MajorSeq,
SysDate, Points
From
[dbo].[StudentRegsterations]
inner join
[dbo].[students] on [dbo].[StudentRegsterations].Stu_ID = [dbo].[students].stu_id
order by
[Points] desc, [SysDate] desc;
DECLARE @StuID [int];
DECLARE @Major_ID [int];
DECLARE @MajorSeq [int];
DECLARE @SysDate [date];
DECLARE @Points [decimal](10, 2);
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points;
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff with scalar values
--InsertThisStudent()
print CAST(@Points as varchar(10)) + ' - ' + CAST(@SysDate as varchar(20))
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
以上循环查询抛出正常选择。
但是,如果我将其更改为数据透视查询,则会出现以下错误。
Msg 16924, Level 16, State 1, Line 31
Cursorfetch: The number of variables declared in the INTO list must match that of selected columns.
导致错误的数据透视查询是这样的。
DECLARE db_cursor CURSOR FOR
SELECT *
FROM
(Select top 100 percent
[students].stu_id as StuID, SysDate, Points, MajorSeq, Major_ID
From
[dbo].[StudentRegsterations]
inner join
[dbo].[students] on [dbo].[StudentRegsterations].Stu_ID = [dbo].[students].stu_id) WorkOrders
PIVOT
(
max(Major_ID)
FOR [MajorSeq] IN (
[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
[11],[12],[13],[14],[15],[16],[17],[18],[19],[20]
)
) AS PivotTable
order by [Points] desc,[SysDate] desc
DECLARE @StuID [int];
DECLARE @Major_ID [int];
DECLARE @MajorSeq [int];
DECLARE @SysDate [date];
DECLARE @Points [decimal](10, 2);
DECLARE @1 [int];DECLARE @2 [int];DECLARE @3 [int];DECLARE @4 [int];DECLARE @5 [int];DECLARE @6 [int];DECLARE @7 [int];
DECLARE @8 [int];DECLARE @9 [int];DECLARE @10 [int];DECLARE @11 [int];DECLARE @12 [int];DECLARE @13 [int];DECLARE @14 [int];
DECLARE @15 [int];DECLARE @16 [int];DECLARE @17 [int];DECLARE @18 [int];DECLARE @19 [int];DECLARE @20 [int];
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points,
@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20;
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff with scalar values
--InsertThisStudent()
print CAST(@Points as varchar(10)) + ' - ' + CAST(@SysDate as varchar(20))
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points, @1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
简述所有我想要的,使用任何 SQL 服务器方式循环数据透视查询,使用任何小查询样本,未提交我的代码。
将数据透视查询的结果保存到临时 table(使用 INTO #TempTable
)并循环 #TempTable。
编辑。但是,它也应该适用于您的代码。也许尝试 CLOSE db_cursor
并再次执行它。我认为您已经有了导致问题的 db_cursor 的一些定义。