【问题标题】:I need to compute a bunch of per-row values: how can I avoid looping through a table's rows in t-sql我需要计算一堆每行值:如何避免循环遍历 t-sql 中的表行
【发布时间】:2012-04-18 09:00:17
【问题描述】:

我有一张设施表和一张传输表。我想计算各种信息,例如,设施 X 在 2011 年 4 月发送了 10124321409 次传输,其中 9959 次丢失了 SSN。这些是巨大的表,所以我会将这些计算值存储在一个“缓存”表中,以便当用户使用 UI 查看我们的系统时(例如选择日期范围)可以轻松访问它们。我有一堆用户定义的函数,它们接受设施名称和日期范围并计算一个值,就像这样

 set @s = dbo.getPctMissingSSNs(facilityX, 1/1/2012, 1/15/2012) //returns pct missing ssn from 1/1/12 to 1/15/12 at facilityX

从stackoverflow,我了解到

  1. 循环遍历表的行是个坏主意What is the best way to loop over a table's rows?
  2. 最好使用存储过程进行此类计算,而不是将数据从服务器调用到客户端,计算值,然后将输出上传回服务器的缓存。

有没有一种方法可以更新每个设施的缓存,用于一堆日期范围,而无需 (1) 循环遍历 T-SQL 中的行(错误)或 (2) 循环遍历 VB 中的行。 net 从服务器下载值,然后再次上传(也不好)

【问题讨论】:

  • 如果那是一个标量 UDF,您不能将 UDF 作为选择的一部分调用,以进行任何插入/更新吗?
  • 它是一个标量 udf。设施名称是表中的一行。我使用该名称作为参数。我想做一些类似的事情,对于表更新缓存中的每个 fac 到 udf(fac)。但这似乎需要遍历行
  • 您不需要为此循环。我在移动设备上很难做一个很好的例子,但这听起来就像一个 upsert(TSQL 中的MERGE)并加入。

标签: .net tsql


【解决方案1】:

使用更新查询。 T-SQL 将字段的名称解释为输入参数。因此,如果您有一个包含两列的表:facilityName 和 cacheValue 字段,您可以执行类似的操作来更新 cacheValue 字段,使其等于 scalarUserDefinedFunction(facilityName)

Update cacheTable set cacheValue=scalarUserDefinedFunction(cacheTable.FacilityName)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多