用于填充 Sql Server CURSOR 的 SELECT 语句(通常)可以返回零行。
是否建议将其包含在 IF 检查中,以便 CURSOR 不会被声明、打开、关闭和释放?
或者 RDMS 是否会自动知道不创建 CURSOR 和/或基于完全相同的 SELECT 的 IF 是否会推断查询处理两次?
用于填充 Sql Server CURSOR 的 SELECT 语句(通常)可以返回零行。
是否建议将其包含在 IF 检查中,以便 CURSOR 不会被声明、打开、关闭和释放?
或者 RDMS 是否会自动知道不创建 CURSOR 和/或基于完全相同的 SELECT 的 IF 是否会推断查询处理两次?
SQL Server 中的存储过程 INSERT INTO table1 VALUES A , B
值集 A 具有以下参数之一:(SELECT TOP 1 cashbalance - 1 FROM table1 WHERE userid = __ ORDER BYcreatedUTC, ID)
值集 B 具有以下参数之一:(SELECT TOP 1 cashbalance + 1 FROM table1 WHERE userid = __ ORDER BYcreatedUTC, ID)
当作为多个插入运行时,SELECT 语句仅运行一次,因此如果两个值集的 userid 相同,则 cashbalance 字段表示从第一个插入行中的 0 条记录 -1 和 1 开始(即不返回到 0)正如它应该的那样)在第二个插入的行中。此外,两行的createdUTC字段记录了完全相同的值。
当作为连续的单独 INSERT 语句运行时,cashbalance 字段可以正确计算,但createdUTC 字段有一个微小的间隙 - 但推断出对另一个插入/读取的关注。
显然与锁和/或序列化有关——我正在研究并将发布结果(尽管非常欢迎建议)。我也可以 SELECT SUM(table1.amounts) +/- 1 WHERE userid = __ (并注意 1 实际上是一个变量),但这并不能解决任何一个问题。此外,这个 sp 是四个 sp 进程(加上另一个调用 sp)的一步,这使得在哪里实现任何锁或事务变得更加复杂。
理想情况下,我尝试使用立即连续的 id 和相同的createdUTC 来实现复式记账(即每笔交易都有一行借记 A,另一行同时贷记 B 相同的金额)。