我应该做增量加载和使用下面的结构。语句是否按顺序执行,即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发布于 2018-01-31 05:28:14
需要非常清楚的是: U-SQL脚本不是逐条语句执行的。相反,它按顺序对DDL/DML/OUTPUT语句进行分组,查询表达式只是插入和输出的子树。但首先它在编译期间将数据绑定到它们的名称,因此select from TableA将绑定到数据(有点像轻量级快照),所以即使在SELECT之前执行truncate,您仍然可以从表A中读取数据(请注意,权限更改可能会影响这一点)。
此外,如果您的脚本在执行阶段失败,您应该有一个原子执行。这意味着如果插入失败,截断应该在最后撤消。
话虽如此,为什么不增量地使用INSERT并定期使用ALTER TABLE REBUILD,而不是执行上面的模式,即在每次插入时读取整个表?
https://stackoverflow.com/questions/48529789
复制相似问题