【问题标题】:Insert and update in a cursor in SQL Server在 SQL Server 中的游标中插入和更新
【发布时间】:2019-06-05 15:58:17
【问题描述】:

我有一个如下所示的表格

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

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

谢谢

【问题讨论】:

标签: sql sql-server sql-server-2014


【解决方案1】:

使用 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

【讨论】:

  • 谢谢..我得到 NULL..22,33 等值仅用于演示目的..这些值是动态生成的。
  • @user1221989 你需要写一个动态枢轴
  • 好的,谢谢..我会研究一下 Pivot 的工作原理。
  • @user1221989 检查更新。但请记住尝试了解代码的作用,而不仅仅是复制/粘贴它而不关心学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多