代码之家  ›  专栏  ›  技术社区  ›  SP1

在SQL Server中的游标中插入和更新

  •  0
  • SP1  · 技术社区  · 6 年前

    我有一张如下所示的表格

    DateRange
    10/1
    11/1
    12/1
    

    我使用游标在这个表中循环,并尝试填充一个临时表

    Create table #BidStatusCalculation1
    (    
      Code nvarchar(max), 
      Data int  
    )
    Declare @monthStart varchar(20)   
    DECLARE cur CURSOR FOR SELECT DateRange FROM @dateRange
    OPEN cur
    FETCH NEXT FROM cur INTO @monthStart
    WHILE @@FETCH_STATUS = 0 BEGIN
    
    Insert into #BidStatusCalculation1
        select 'SL Payroll',Count(*) from DashboardData
        where DataType = 'Bid'
        and CONVERT(NVARCHAR, CreatedDate, 105) = convert(datetime, 
                                                 (@monthStart+'/'+@RequestYear))  
    
    FETCH NEXT FROM cur INTO @monthStart
    END
    CLOSE cur    
    DEALLOCATE cur
    

    Code          Data
    SL Payroll    22
    SL Payroll    33
    SL Payroll    43
    

    我希望修改表,以便只得到一行

    Code         Data1   Data2   Data3
    SL Payroll   22       33      43
    

    有人能告诉我,在第一个循环的表中插入数据,然后更新数据,这是一种好方法。我可以设置一个变量来计算循环迭代次数,然后编写单独的插入和更新,但我想知道是否有更好的方法。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ilyes    6 年前

    使用 PIVOT

    SELECT Code,
           [22] Data1,
           [33] Data2,
           [43] Data3
    FROM
        (
          SELECT *
          FROM T
        ) TBL
        PIVOT
        (
          MAX(Data) FOR Data IN([22],[33],[43])
        ) PVT
    

    Demo

    动态轴心

    CREATE TABLE T
    (
      Code VARCHAR(45),
      Data INT
    );
    
    INSERT INTO T VALUES
    ('SL Payroll',    22),
    ('SL Payroll',    33),
    ('SL Payroll',    43);
    
    DECLARE @IN VARCHAR(MAX) = '',
            @Cols VARCHAR(MAX) = '';
    
    SELECT @IN = @IN + ',' + QUOTENAME(Data),
           @Cols = @Cols + ',' + QUOTENAME(Data) + ' AS Data'+
                   CAST(ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) AS VARCHAR)
    FROM T;
    
    SELECT @IN = STUFF(@IN, 1, 1, ''), @Cols = STUFF(@Cols, 1, 1, '');
    
    DECLARE @SQL NVARCHAR(MAX) = N'SELECT Code, ' +
                                   @Cols+
                                   ' FROM (SELECT * FROM T) TBL PIVOT (MAX(Data) FOR Data IN('+
                                   @IN+
                                   ')) PVT';
         EXECUTE sp_executesql @SQL;
    

    Demo