【问题标题】:Create stored proc to pull data from another SP with dynamic columns创建存储过程以使用动态列从另一个 SP 中提取数据
【发布时间】:2020-06-24 20:47:29
【问题描述】:

我创建了一个带有动态数据透视逻辑的 SP,以引入每小时呼叫次数的数据。因为我在不同的服务器上有这个报告。现在我需要创建一个从这个动态数据透视表中提取数据的主 SP。我已经定义了我的临时表,但这会破坏当天的报告,因为在同一天的下午 12 点之前没有创建所有存储桶。对于每台服务器上的单个报表,我将动态数据透视表数据插入到一个临时表中。例如:

create table #temp( Emp_name varchar(30), calltime varchar(30), totalcall varchar(30), 
  midnighthr int not null default 0 , 1am int not null default 0, 
  2am,3am,4am, 5am, 6am, 7am,...,9pm,10pm, to 11pm)


insert into #temp
EXEC @sql

select (Emp_name, calltime , totalcall , midnighthr, 1am , 
        2am,3am,4am,5am,6am, 7am,...,9pm,10pm,to 11pm)

因此,如果我为 DateTime: 6/24/2020 4:00 PM 运行此报告,则此报告将失败,因为 @sql 创建的列数不能证明 #temp 表中定义的列是合理的,因为我们没有列下午 5 点以后。

知道如何解决这个问题吗?

【问题讨论】:

  • 为什么不根据构建@sql 的相同逻辑构建#temp create table 语句?
  • 动态列仅在报告工具直接使用数据时才有用。如您所见,如果您之后需要进一步操作它,就会变得很困难。我建议您更改原始 SP 的逻辑,以根据 SP 输入参数返回固定或动态列数。然后在您的父 SP 中调用这些 SP,指定参数以返回固定数量的列。额外的输入参数可以有一个默认值,告诉 SP 返回动态结果集,这样从这些 SP 消费数据的现有进程不会受到影响。
  • 嗨,亚历克斯,感谢您的回复。每次传递参数时,我的 SP 都会创建动态列。例如,如果我使用 06/23/20 作为我的日期,它可能会生成从上午 7 点到上午 10 点的数据(每小时列,即上午 7 点、上午 8 点、上午 9 点、... 上午 10 点)或者如果我使用 06 /22/20 它可能会从下午 5 点到晚上 9 点生成数据(每小时列为下午 5 点、下午 6 点、晚上 7 点、.. 晚上 9 点)。我尝试使用 CASE WHEN [2pm hr] IS NULL THEN 0 ELSE [2pm hr] END AS [2pm hr]
  • 我建议您修改您的 SP 以始终根据新参数创建固定数量的列。
  • 我同意@AaronBertrand,解决这个问题的唯一方法是动态创建临时表,就像您尝试运行 SP 时一样。换句话说,在您运行您的 SP 之前,运行相同的逻辑来获取当时的列,然后动态创建临时表,然后只运行您的 SP 以相应地插入数据......如果您需要这方面的帮助,请提供我们提供样本数据和您的原始 SP,然后我们会为您相应地更改它...

标签: mysql sql-server tsql


【解决方案1】:

感谢您的反馈。要求发生了变化,他们决定将默认值设置为 0。我正在创建一个临时表 SET @SQL = ' SELECT wrkGrp, userID., DTName,' + @Columns + ' FROM( SELECT tsdh.wrkGrp,tsdh.userID,SUBSTRING(tsdh.Datehour,1,10) As DTName, SUBSTRING(tsdh.Datehour,12,2) AS HourName,tsdh.CallTotal FROM #tmpsummaryDH tsdh) as PivotData PIVOT(SUM(CallTotal ) FOR HourName IN (' + @Columns + ' ) ) AS PivotResult ORDER BY wrkGrp, userID, DTName' ; INSERT INTO #tmpPivot EXEC(@SQL); SELECT COALESCE([Midnight hr],0) AS [Midnight hr], etc

【讨论】:

  • 能否请您格式化您在此处粘贴的代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
相关资源
最近更新 更多