问题标签 [rbar]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1954 浏览

sql - SQL Server:在不使用游标的情况下为每一行调用具有副作用的存储过程

在你说这与不使用游标的每一行的 SQL 调用存储过程相同之前,让我澄清一下我的问题:

存储过程确实有副作用。事实上,这都是关于这些副作用的,因为每次调用的结果都会影响进一步的处理。

可以这样想:表包含规则定义,而 proc 按字面意思执行这些规则 RBAR,对另一个表进行更改。

在这些情况下,我看不出如何进行设置操作,由于副作用,可能无法使用 CROSS APPLY,但也不需要它,因为我并没有真正加入规则表并获得任何结果。

如果解决方案真的是 RBAR,我还是应该尽量避免使用 CURSOR 吗?将 WHILE 与 READ TOP 1 WHERE Key > @Key 一起使用是更好的解决方案吗?为什么?

我搜索得越多,我就越得出这样的结论:fast_forward read_only cursor 是最简单和最快的解决方案。

0 投票
2 回答
115 浏览

sql-server-2008 - 基于字段创建可读的唯一键

webguys 想要基于产品名称的唯一 url 如果更多产品具有相同的名称,请在名称后添加一个数字。

our.dom/red-sock

our.dom/red-sock-1

他们想要所有产品上的产品 ID 或其他数字,即

our.dom/red-sock-123481354

我将其存储在我称为 seourl 的字段中。

当我创建新产品时,我已经涵盖了它,触发器尝试添加 seourl,如果它已经存在,则增加数字,直到找到唯一值。

但我现在必须给整张桌子新的seourls。如果我只是

肯定有碰撞,操作回滚。有没有办法让语句提交有效的更新,而其余的保持不变?

还是我必须在循环中执行 RBAR,Row By Agonizing Row 操作?

0 投票
5 回答
52716 浏览

vb.net - 在 VB.Net 中快速将大数据表导​​出到 Excel 电子表格

我有一个有趣的难题,我如何快速(不到 1 分钟)将大型数据表(从 SQL 填充,35,000 行)导出到 Excel 电子表格中供用户使用。我有可以处理导出的代码,虽然代码本身没有“错误”,但导出整个文件需要 4 分钟的时间非常慢(如果用户的 RAM 较少或运行更多,则有时会更长)他们的系统)。可悲的是,这比过去使用我们的旧方法需要 10 多分钟的时间有所改进。简而言之,如果不使用 3rd 方组件,这可以更快吗?如果是这样,怎么做?我的代码如下,在每行写入的消息框 6 和 7 之间发生减速。感谢大家抽出时间来看看这个:

0 投票
2 回答
994 浏览

sql-server - SQL中当前记录日期字段当天或之前的累计每日总和

重要提示:我需要它与 SQL Server 2000 兼容。

我需要一个累积总和,但基于当前日期字段,像我现在使用的那样的更新查询可以工作,但它非常慢(丑陋的隐式 RBAR 三角连接):

我也尝试过使用游标方法来运行总计,但我无法用它解决 RBAR 问题,看到日期比较仍然存在,而且速度仍然非常慢:

所以,这个累积和的问题是那里的日期比较,它使查询超级慢(我在运行 10 分钟后停止了代码,评论这个更新游标只需要 3 秒运行),我的行数测试是 28K,当记录数增加时,看起来所花费的时间呈指数增长,这就是为什么我认为问题是这里发生了一个 RBAR(意思是“Row-By-Agonizing-Row”)。

编辑:经过一些测试,看起来日期不是唯一的问题,有没有办法通过对游标内的变量或类似的东西求和来使这个运行总计?

EDIT2:我目前正在寻找一种方法来进行第一次更新的操作(基于 4 个字段和日期的一天总计)但更快,我昨天已经接近它在光标内手动添加逻辑但光标太大且难以维护,那么对于这种情况,哪种跑步技术是最好的(更快)?您将如何在这里实施该技术?这不是一个简单的总计,当这些字段中的任何一个发生变化时都应该进行削减。字段EsSaldoAnterior变化只能为0或-1,当该字段为0时,更新只影响外部表,而当该字段为-1时,内部运行总计和。 EsSaldoAnterior表示类似于“其先前金额”的意思,这意味着运行总计不应从零开始,它们应首先开始对这些金额求和(如果存在),如果使用 ORDER BY,则为以下顺序:

0 投票
1 回答
66 浏览

sql - 从多个位置挑选足够的物品而不做 rbar

我有一个仓库,每个项目编号可以在多个位置。我有一个首选的订单可供选择。

首选顺序是位置名称的函数,为了简单起见,我们只说它是order by loc asc

我有一个订单

我想要一个选项列表进入第三个表。

如果我只是加入,我会得到三行 item_1

我想在单个 sql 语句中执行此操作,而不是 RBAR,Row By Agonizing Row 循环。

我正在使用 Mssql 2008

0 投票
1 回答
124 浏览

sql-server - SQL Server 2012 插入一组并获取所有 PK 值?

我有一个需要 TVP 的存储过程,输入有 6,000 行。当前代码将 TVP 复制到临时表中,在临时表上迭代 RBAR 以在真实表上插入一行,从插入中获取 Identity/PK 值,使用 PK 更新临时表(稍后在存储过程中使用),然后重复。

有没有一种很酷和/或快速的方法来插入整个临时表,然后用 PK 值更新它?没有什么直截了当的想法浮现在脑海中,所有想法都受到赞赏。

我想我可以在临时表中添加一个附加列并在其上放置一个序列号,以便行都是唯一的并遵循这个想法: http ://www.sqlteam.com/article/using-the-output-clause- to-capture-identity-values-on-multi-row-inserts但我对其他基于集合的建议持开放态度....

谢谢。

0 投票
0 回答
340 浏览

sql - SQL While 循环查找链替换/替换的结束

我已经阅读了很多关于处理表 RBAR 效率非常低的信息,虽然我知道这不是 SQL 的优化目标,但我很想看看是否有一种方法可以完成这项任务并避免循环或一组嵌套的 CASE 语句(因为我一次只能嵌套 10 个)。

问题:我有一个主库存文件(mif 表),其中包含我们所有的零件编号,并带有一个标志来表示该零件是否已被另一个零件取代/替换。还有另一个表包含该部分被替换的内容。问题在于,如果您愿意的话,替代级别是一个独立的单元。例如,如果第 123 部分被替换为 456,但 456 被替换为 789,那么到目前为止还没有任何东西可以直接告诉我们第 123 部分最终被替换为 789 部分。

我正在尝试创建一个表来记录初始编号和最终替换第 123 部分的链结束部分编号。

很抱歉,这很长,但这里有两个查询的简化版本,它们都可以工作(一个 LOOP 和一个 CASE 语句),但都有局限性。有没有办法既有效地做到这一点,又能让我扩展过去的 10 个 CASE 语句?

正在使用两个表:mif 和 dc_dim:

mif结构:

dc_dim 结构:

首先,使用循环:

现在使用 CASE 语句:

这两个都将在 SUPERSESSION_EOC 表中正确插入 ABC 123 部分的记录,如下所示:

使用 CASE 语句的插入查询仅用了 2 多分钟就插入了 358,000 条记录。使用循环的插入运行了 20 分钟,当我停止查询时只插入了 9,000 条记录。除非我嵌套嵌套的 CASE 语句以一次获得 10 个以上的语句,否则使用 CASE 语句的插入限制为 10 个超级会话,而循环插入查询按原样无法使用。

关于如何使这个过程可扩展和高效的任何想法?任何帮助都将不胜感激。再一次,我很抱歉它这么长,但我想给你我正在使用的所有东西。

编辑:我刚刚尝试使用带有 OUTER APPLY 的递归 CTE,它有效,但仍然很慢:

0 投票
1 回答
35 浏览

sql-server - SQL Server 似乎以异步方式运行

我知道默认情况下 SQL 语句不会异步执行,但我遇到的情况似乎是这样的。

  • [#data]
  • [tbl_Bucket]
  • [tbl_IDPool]

程序

  • [sp_InsertIntoBucket]
  • [sp_GenerateID]
  • [sp_UpdateIDPool]

过程

  • 一个应用程序调用[sp_InsertIntoBucket]
  • [sp_InsertIntoBucket]来电[sp_GenerateID]
  • [sp_GenerateID]查询[tbl_IDPool]并生成一个值
  • [sp_GenerateID]来电[sp_UpdateIDPool]
  • [sp_UpdateIDPool]写信给[tbl_IDPool]
  • [sp_GenerateID]将其生成的值返回给[sp_InsertIntoBucket]
  • [sp_InsertIntoBucket]使用该值作为新记录的主键[tbl_Bucket]
  • [sp_InsertIntoBucket]将生成的值返回给调用者

设想

[#data]有信息(1500 - 12000 条记录)发往[tbl_Bucket]. 由于[sp_InsertIntoBucket]一次只能处理一条记录,因此该过程是 RBAR 的——因为每条记录都[#data] [sp_InsertIntoBucket]被调用。

问题

[sp_GenerateID]生成重复值。INSERT在实际发生[sp_InsertIntoBucket]并引发错误之前,我已经有 13 到 130 个重复生成的值。

生成的值取决于输入的数据,[tbl_IDPool]因此[sp_UpdateIDPool]为每次[sp_GenerateID]调用调用以确保下一次 [sp_GenerateID]调用生成唯一值也很重要。

我怀疑这与在完成写入[sp_GenerateID]之前被第二次调用有关。但这没有意义,因为 RBAR在移动到下一个条目之前应该等待哪个应该等待哪个应该等待,对吧?[sp_UpdateIDPool][tbl_IDPool][sp_InsertIntoBucket][sp_GenerateID][sp_UpdateIDPool][#data]

我试过的

  • WAITFOR DELAY "00:00:00.003"- 这行得通,但我正在寻找更好、更高效、更优雅的解决方案。
  • WHILEvs. CURSOR- 唯一的区别是CURSOR稍慢。
  • 在希望写入(第一次调用)会锁定读取(第二次调用)WITH (NOLOCK)[sp_GenerateID]查询中有和没有。[tbl_IDPool]
0 投票
1 回答
384 浏览

sql-server - SQL Server - 基于集合的瀑布

我有一个表,将数字余额存储在不同的存储桶(存储桶 1、2 和 3)中。在系统中过帐金额时,必须将金额分配到存储桶。事务类型决定了它如何影响存储桶。类型 1、2 和 3 增加各自的桶(无瀑布),而类型 0 使用瀑布减少桶。这意味着类型 0 的数量首先减少桶 1,然后任何剩余减少桶 2,任何剩余减少桶 3。

我目前使用一个游标应用金额,该游标遍历每个发布的金额。由于瀑布,应用金额的顺序是关键。显然,在处理数十万数量时,它的速度相当慢。我想知道是否有一个基于集合的方法来做到这一点?

生成表和记录的代码:

http://pastebin.com/XgKrKkbm

我分配金额的光标如下:

创建和插入脚本位于 PasteBin 中,因为在包含它们时不允许我发布问题(文本长度?)。


围绕瀑布序列的清晰示例至关重要:

从以下内容开始:

申请的两个金额如下

如果金额按顺序应用,结果如下:

然而,金额以相反的顺序应用它们,结果是不正确的:

0 投票
1 回答
42 浏览

sql-server - MSSQL 查找发起者批处理 - 没有游标

我正在寻找有关 SQL2016 的以下方面的帮助

我有批次需要识别父批次。

我需要填写的是 ParentBatchID 并且应该按照这个逻辑工作:

  1. 如果存在上一个批次,其中当前批次的起始日期介于上一个批次的起始日期和终止日期之间 -> 那就是父级
  2. 如果识别的parrent的parrentBatchID为0,则获取parrent的BatchID,如果不为0,则获取parrent的ParrentBatchID(继承)

到目前为止,我是用光标完成的,但性能是,你知道的,RBAR。*当当前 fromDate 介于前一个 from 和 to date+1 之间时,则 isnull(parrentBatchID,batchid) *

我尝试使用窗口函数,但是由于我需要继承的 parrentID 在下一行中还不存在,所以我失败了,到处都是 0-s :(

我对数据进行了自由操作,并尝试了各种准备方法。

预期产出

---------- 有一个扩展的问题版本,如果我确定了父母,我需要用孩子的长度日来延长它的长度,我需要检查下一个孩子是否来自从 -> 到 + 前一个孩子的长度。坦率地说,我不知道如何实现这一点。---------- 扩展版的 - 第 4 行会有所不同

欢迎所有指导和帮助提前谢谢你

尼古拉


编辑

递归解决方案很棒,但仅适用于最有限的数据集。你能建议一种更具可扩展性的方法吗?

谢谢