2016-05-24 23 views
0

次の説明が長すぎる場合は、以下のコードを読まずに読んでください。SQL Serverのピボットクエリをループする方法

これを上書きして最後の行を見てください。

カーソルを使用してこの通常のループ照会があり、正常に動作します。

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; 

このクエリは上記のループ処理で通常の選択をスローします。

私はそれをピボットクエリに変更した場合、私に次のエラーが出ました。

メッセージ16924、レベル16、状態1、行31
Cursorfetch:INTOリストで宣言された変数の数は、選択した列のものと一致しなければなりません。

このエラーを引き起こすピボットクエリはこれです。

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 Serverの方法を使用して、ピボットクエリをループします。

答えて

0

ピボットクエリの結果をtempテーブル(INTO #TempTableを使用)とループ#TempTableに保存します。

EDIT。しかし、あなたのコードでも動作するはずです。たぶんCLOSE db_cursorを試して、もう一度実行してください。私はあなたがすでに問題を引き起こすdb_cursorのいくつかの定義を持っていると思います。

+0

あなたが言ったように私のコードには必須のエラーはありません。私はちょうどトウの列( '@Major_ID、@ MajorSeq')はピボット選択から現れません。 thayがピボットカラム '@ 1、@ 2、@ 3、' ....などを埋めるので、私はそれを削除します。 –

関連する問題