Rhino INSERT SQL statement



从犀牛,我正在运行以下脚本:

var SQLstatement = connection.createStatement();
query =  "INSERT INTO TableName(ID, Name, Date) VALUES   ('1234', 'John Smith', '2012-05-24')";
for (var i = 0; i <= 1500; i++)
    {
    SQLstatement.executeUpdate(query);  
}

我试图做的只是将上面查询中列出的值的 1,500 倍插入到 SQL 表中。

但是,由于 SQL 的限制,该语句仅插入 1000 条记录。有没有办法插入所有 1500 条记录?我宁愿不使用任何带有批量插入选项的文本文件。

换个方法怎么样——只运行一次sql语句。 这将创建一个cartesian product,该在单个语句中创建 1500 条记录。

INSERT INTO TableName(ID, Name, Date) 
SELECT '1234', 'John Smith', '2012-05-24'
FROM (SELECT 1 rn UNION SELECT 2) t, (SELECT 1 rn union SELECT 2) t2,
     (SELECT 1 rn union SELECT 2) t3, (SELECT 1 rn union SELECT 2) t4,
     (SELECT 1 rn union SELECT 2) t5, (SELECT 1 rn union SELECT 2) t6,
     (SELECT 1 rn union SELECT 2) t7, (SELECT 1 rn union SELECT 2) t8,
     (SELECT 1 rn union SELECT 2) t9, (SELECT 1 rn union SELECT 2) t10,
     (SELECT 1 rn union SELECT 2) t11, (SELECT 1 rn union SELECT 2) t12
LIMIT 1500
  • SQL 小提琴演示

没有什么可以限制您只能插入 1000 次,因此听起来与提交有关。请尝试以下选项:

  1. 在末尾添加提交
  2. 检查 Rhino 中是否有某种设置以 1000 为批次
  3. 提交
  4. 尝试分别运行 500 次和 2500 次迭代的代码,并检查每种情况下插入了多少条记录

Domt 知道您面临的问题是什么,以便不会一次性插入 1500 条记录,但如果有东西,则将循环一分为二,1:- 0 到 999,然后 1000 到 1500。

(只是示例概念,而不是实际代码)

BEGIn TRAN
        for (var i = 0; i <= 999; i++)
        {
           SQLstatement.executeUpdate(query);  
         }
COMMIT
 BEGIn TRAN   
        for (var i = 1000; i <= 1500; i++)
        {
             SQLstatement.executeUpdate(query);  
        }
COMMIT

我确信正在发生的事情是@benji走在正确的轨道上。我的猜测是,除非缓冲区达到 1,000,否则您的数据库实现会在不提交的情况下缓冲记录;然后它提交。当运行第 1,000 个(或者可能是第 1,001 个)时,您的前 1,000 个进入,但其余的永远不会提交。

所以这里的答案是未提供的部分实现。这与 Rhino 或 SQL 无关。这也意味着其他建议(例如一次只插入 1,000 个)也不起作用,因为驱动程序在这些情况下永远不会提交第二批,并且会巧合地提交第一批。

发布有关数据库驱动程序,连接等的更多信息,我们也许能够为您提供帮助。

或者对于更黑暗的版本,请尝试在程序末尾添加 connection.commit()(我对connection是什么做了一些假设,所以这可能不起作用)。

最新更新