SqlCommand.ExecuteNonQuery() 是否在错误前插入前一行?

Does SqlCommand.ExecuteNonQuery() insert previous rows before an error?

我在 sql 服务器中创建了一个临时 table。我有 sql 命令对象的 commandText 从临时 table 插入到另一个 table。我的问题是:它是否在到达错误行之前插入行?

例如,假设 temptable 中有 1000 行,tableA 中有 0 行。我从 temptable 插入到 tableA。第999行有错误,抛出异常。 tableA里面有989行吗?还是0?

我试过用谷歌搜索这个问题,但我什么也没找到。我还阅读了 SQLCommand.ExecuteNonQuery() 上的文档,但没有找到答案。我将不胜感激任何帮助或线索。

既然你的INSERT是单条语句,那就不行。 tableA 中将有 0 行。

如果您在一个批处理中有多个语句,那么每个成功执行的语句都将执行请求的修改,但出错的语句除外,这将使表保持前一个批处理完成时的状态。

如果您将上面提到的多语句批处理包装在 TRANSACTION 中,那么,一般来说,如果其中一个语句出错,您可以将整个批处理回滚到任何语句执行之前的状态.

注意:同样,这是一般情况。有许多外部因素会使您的数据处于不一致状态(服务器故障、IO 损坏等),在这种情况下 SQL 服务器将尝试从事务日志中回滚您的数据。

这是一条语句

INSERT tableA (col1,col2,col3)
SELECT col1,col2,col3
FROM #tmpTable;

此处的错误(例如数据类型不匹配、NOT NULL 列上的 NULL 值等)将导致 0 行被插入到表 A 中。