我应该做增量加载并使用以下结构。
这些语句是按顺序执行的,即在获得数据的前两个语句之前永远不会执行TRUNCATE
:
@newData = Extract ... (FROM FILE STREAM)
@existingData = SELECT * FROM dbo.TableA //this is ADLA table
@allData = SELECT * FROM @newData UNION ALL SELECT * FROM @existingData
TRUNCATE TABLE dbo.TableA;
INSERT INTO dbo.TableA SELECT * FROM @allData
答案 0 :(得分:2)
非常清楚:U-SQL脚本不是逐个语句执行的。相反,它按顺序对DDL / DML / OUTPUT语句进行分组,查询表达式只是插入和输出的子树。但首先它会在编译期间将数据绑定到它们的名称,因此TableA中的SELECT将绑定到数据(有点像轻量级快照),所以即使截断在select之前执行,你仍然应该能够从表A中读取数据(请注意,权限更改可能会影响该表)。
此外,如果您的脚本在执行阶段失败,则应该执行原子操作。这意味着如果你的INSERT失败,那么TRUNCATE应该在最后撤消。
话虽如此,为什么不逐步使用INSERT并定期使用ALTER TABLE REBUILD而不是执行上述每次插入时读取完整表格的模式?