问题标签 [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.
sql - .NET 多行 SQL 插入支持基于集合的操作
如果我们想在 SQL 中向表中插入多个值,我们可以使用以下方法:
然而,这是一个 RBAR 操作,通常被认为是不好的:
所以我们会做一个基于集合的INSERT
语句:
如果我们正在创建一个 .NET 应用程序,并且想要在单击按钮时执行上述插入操作,我们将使用 ADO.NET 库并希望执行上述基于集合的操作,而不是 RBAR 库。
然而,这似乎并不容易做到,谷歌搜索带来了以下结果
使用 for 循环将多条记录插入 SQL Server 数据库
这似乎建议INSERT
在循环中执行语句,因此运行INSERT
每个循环迭代(因此是 RBAR 操作)
我不明白这一点,如果 RBAR 不好,为什么在 ADO.NET 库中对基于集合的操作的内置支持似乎很少,导致最好的方法是 RBAR?
sql-server - 如何将基于 CURSOR 的查询转换为基于 SET 的查询
我不是 SQL 专家,我正在编写一个庞大的 SQL 代码,不幸的是,它有一个 CURSOR 处理其中的另外两个嵌套 CURSORS(存储过程中总共三个游标),它处理数百万要删除的数据,更新和插入。
由于逐行执行,这需要大量时间(超过 13 小时并最终得到错误“光标名称数据集已存在”),我正在尝试将其修改为基于 SET 的方法,但我被卡住了在转换为基于 SET 的方法时执行 INSERT、DELETE 和 UPDATE。或者换句话说,我不能通过在 JOINS 中替换它们来完成所有的 INSERT、DELETE 和 UPDATE。
我知道这是一个大代码,可能不适合在这里发布,但我已经以一种简单的方式将它放在另一篇帖子中,人们不明白我的问题,所以我把实际代码放在这里。
这是我正在处理的代码:
这是我尝试做的并且陷入中间和不完整的事情:
样本数据
T_Projects 和数据集的表和数据 - http://www.sqlfiddle.com/#!18/00205/2
T_Periods 的表格和数据 - http://www.sqlfiddle.com/#!18/3b6b1/2
T_uploads 的表和数据(在游标运行之前)- http://www.sqlfiddle.com/#!18/7d12f3/1
其他表数据 1 - http://www.sqlfiddle.com/#!18/6e499
其他表数据 2 - http://www.sqlfiddle.com/#!18/30e3b/3
函数 fn_getEndOFperiod - http://www.sqlfiddle.com/#!18/54d66
请注意 - 上述任何表格中都会有不止一行,但是我给出的示例只有一条记录。
例外数据
T_uploads 表 - http://sqlfiddle.com/#!18/027cc/1
T_ProjectsGroupData 总共将有 15 条记录,即对于每个 T_uploads.ID(与 T_ProjectsGroupData .UploadID 字段相关),T_ProjectsGroupData 中都会有一个条目
我除了将这个基于 CURSOR 的代码转换成一个简单的基于 SET 的方法之外,任何改进这个代码的帮助和建议都将是非常可观的。
sql - 这个 SQL 操作可以在不逐行(RBAR)的情况下完成吗?
我有一组任务,其中一些任务比其他任务更重要
每个任务在一个或多个数据库上做一些工作。
这些任务分配给将执行任务的工作人员(应用程序中的线程轮询表)。
当工作人员完成任务后,它会将值设置回 null 以表示它可以再次接受工作。
在将任务分配给工作人员时,我想对可以在任何时候使用的数据库连接数施加上限 - 因此使用当前处于其限制的数据库的任务将不会分配给工人。
我可以通过从数据库限制中减去当前分配给工作人员的任务数据库来获得可用的数据库连接数。
我的问题是,如何根据可用的数据库连接数按重要性顺序选择可以运行的任务,而不是逐行执行?
我希望下面的例子能说明我的问题:
右边是可用的数据库连接,随着我们按重要性顺序向下排列任务列表,它会减少。
如果我按照任务的重要性顺序选择它们,那么可用于下一个任务的连接取决于是否选择了前一个任务,这取决于是否有空间用于所有数据库连接。
在上述情况下,任务 7 只能运行,因为任务 6 不能
任务 8 也无法运行,因为任务 5 使用了与数据库 C 的最后一个连接,因为它是一项更重要的任务。
问题:
有没有办法在不使用while循环并逐行执行的情况下解决这个问题?