从表

时间:2016-09-06 21:24:13

标签: sql sql-server tsql

我有一个基于存储在表中的动态SQL查询来构建报表的流程。当我最初将其作为概念证明编写时,它能够在使用光标样式过程时成功工作...最初实际上是作为证明中的脚本完成的,使用Do / While - “证据”被移动到tSQL最初采用相同的格式并且成功,除了它像垃圾一样运行,因为它一次迭代1条记录。

我重写了流程以利用SQL的重点 - 大量选择/操作记录......但是我还没有能够以这种方式获取计算并且刚刚使用静态编写的case语句

表: 物品清单 - 只是每个物品的友好标签。 SourceQuery - 包含实际SQL select语句的nvarchar字段 计算 - 包含DateAdd(m,-1,CalcDate)DATEADD(month, DATEDIFF(month, 0, CalcDate), 0)等数据的varchar字段以及基于其他值的许多其他计算。 (CalcDate是当前进入TempTable的选择值)

动态执行采用SourceQuery,构建,然后将其执行到临时表中:

DECLARE @SourceQuery Nvarchar(max)
create table #TempTable...
select distinct @SourceQuery=SourceQuery from vewTaskCombo where ....
Set @SourceQuery = 'Insert into #TempTable...' + @SourceQuery
Execute (@SourceQuery)

以上是将SourceQuery放入临时表但当前没有进行任何计算 - 正如前面提到的那样,当前由更新语句使用CASE语句来决定使用哪个日期计算。

我想要做的是取消CASE语句并允许它直接从表中获取计算。当这样做作为单项迭代时,它很好,因为我们可以将计算分配给变量。

以上只是片段的片段 - 还有其他几个表元素都连接在一起以创建查询并决定计算。

修改回复: 我遇到的问题是如何从表中获取计算以作为语句执行。因此,例如,如果我内部加入计算表,我可以获取它应该是什么类型的计算(DateAdd ....),但它只是作为varchar抓取它,不再能够执行它作为计算。之前因为它一次迭代1次,当前的计算被抓到一个变量并以这种方式执行。但是现在因为我正在大量地做这一切。我可以将公式作为另一个值插入到临时表中,但无法弄清楚如何将其作为计算执行。

目标是执行存储在表中的计算。我可以在临时表中选择计算,但无法弄清楚如何将其作为计算执行而不将其放入单独的变量中 - 并且因为可以有多个计算,所以我不能将它分配给单个变量(不用光标一次完成一个计算,我试图避免这样做。)

目前,静态编写的案例陈述类似于:

Update #TempTable 
Set StartDate = CASE WHEN TaskThresholdID=2 then   
DateAdd(m,-1,CalcDate)
WHEN TaskThresholdID=4 then DateAdd(m,-1,CalcDate)
.
.
.
DueDate = CASE WHEN TaskThresholdID=2 then  DateAdd("D",4,CalcDate)
WHEN TaskThresholdID=4 then CalcDate
.
.
.

目标是从表中获取该计算,而不是将其静态写入过程。

感谢LukStorms进行代码格式编辑。

1 个答案:

答案 0 :(得分:0)

在尝试了一些其他想法后,我最终找到了解决方案。最初尝试使用更正式的方程,虽然我们最终得到了这个问题,但是在一个月的翻译中添加“30”或“31”天太不准确了。

我最终做的是将动态查询构建到表(#UpdateQuery_Temp)中,然后使用COALESCE将这些查询转换为单个查询。最后执行个别查询。

Create Table #UpdateQuery_Temp (TaskThresholdID int, UpdateQuery varchar(max))
insert into #UpdateQuery_Temp
Select Distinct ThresholdID, ('update #TempTable set StartDate=' + StartCalculation + ',DueDate=' + DueCalculation + ' where ThresholdID=' + cast(ThresholdID as varchar(2)) + ' ') FROM #TempTable

DECLARE @UpdateQuery varchar(max)
SELECT @UpdateQuery = COALESCE(@UpdateQuery + ' ',' ') + UpdateQuery + ';'
FROM #UpdateQuery_Temp
EXECUTE (@UpdateQuery)

使用这种格式,无论开始/到期计算的组合有多少,它都可以动态地从表中获取并执行它们。 13,000条记录的执行时间仅为0.01秒 - 生产表只有几百万条记录,但是时间差足够小,以至于值得将它恢复到桌面驱动。