【发布时间】:2016-12-07 11:44:42
【问题描述】:
我正在通过以下方式将数据加载到表中:
DECLARE @srcRc INT;
DECLARE @dstRc INT;
SET @srcRc = ( SELECT COUNT(*) FROM A )
INSERT INTO t
(Col1
,Col2
,Col3
)
SELECT A.Col1
,A.Col2
,B.Col3
FROM A
JOIN B
ON A.Id = B.Id;
SET @dstRc = @@ROWCOUNT
现在我正在比较变量@srcRc 和@dstRc。 ROWCOUNT 必须相同。如果不是,则需要删除插入的行。
Q1:回滚插入的行的最佳策略是什么?
我有几个想法:
1) 如果行数不匹配,则在事务中运行加载并回滚。
2) 将标志列(位)添加到名为toBeDeleted 的目标表中,运行加载,如果行数不匹配,则使用1 值更新toBeDeleted 列以将其标记为删除候选。然后以批处理模式(while-loop)删除。
或者不删除它们,但在使用t 表时始终从查询中排除删除候选者。
3)在插入行之前,先比较行数。如果不匹配,则不要启动加载。
DECLARE @srcRc INT;
DECLARE @dstRc INT;
SET @srcRc = ( SELECT COUNT(1) FROM A );
SET @dstRc = ( SELECT COUNT(1) FROM A JOIN B ON A.Id = B.Id );
Q2:对于更多的行,比方说 10-100 百万,有什么更好的解决方案?
Q3:或者对于类似的案例有没有更好的策略?
【问题讨论】:
标签: sql-server etl sql-server-2016