我在sql server中创建了一个临时表。我有sqlcommand对象的commandText从临时表插入到另一个表。我的问题是:它是否在到达错误行之前插入行?
例如,假设temptable中有1000行,tableA中有0行。我从temptable到tableA进行插入。第999行出错,抛出异常。 tableA里面有989行吗?还是0?
我试过谷歌搜索这个问题,但我没有找到任何东西。我还阅读了SQLCommand.ExecuteNonQuery()上的文档,但没有找到答案。我将不胜感激任何帮助或领导。
答案 0 :(得分:4)
由于您的INSERT
是一个单一的陈述,所以没有。 tableA中将有0行。
如果批处理中有多个语句,则每个成功执行的语句将执行请求的修改,除了错误输出的语句,这将使表保持在前一批完成时的状态。
如果上面提到的多个语句批处理包含在TRANSACTION
内,那么一般来说,如果其中一个语句错误,您可以将整个批处理回滚到执行任何语句之前的状态。 / p>
注意:一般来说,这是一般性的。有许多外部因素会使您的数据处于不一致状态(服务器故障,IO损坏等),在这种情况下,SQL Server将尝试从事务日志中回滚您的数据。
这是一个单一陈述
INSERT tableA (col1,col2,col3)
SELECT col1,col2,col3
FROM #tmpTable;
此处的错误(例如数据类型不匹配,NULL
列上的NOT NULL
值等)将导致将0行插入tableA。