【发布时间】: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