是否可以记录INSERTed行引用以便以后删除?

时间:2017-01-17 11:36:11

标签: c# sql-server visual-studio mstest

为了测试,我将一堆行插入SQLServer DB。我想在最后清理它们..虽然这应该是一个特定的测试数据库,我希望表现良好,以防万一。出于同样的原因,我不想在删除测试数据时假设数据库中可能存在哪些数据,例如删除具有特定范围内日期的所有行或所有行。

当插入行时,我可以捕获对插入的实际行的引用,因此我可以稍后删除那些确切的行,无论它们中的数据是否已被修改。所以我知道我为测试确定了哪些行?

我在ms-test框架中调用来自C#代码的SQLServer查询。

2 个答案:

答案 0 :(得分:2)

是的,可以使用OUTPUT子句。

您需要创建一个中间表来捕获插入的记录标识值。

DECLARE @TAB TABLE(ID INT)

INSERT INTO TABLE1
output inserted.Table1PK into @TAB

SELECT id,name ... ETC

现在检查你的表变量

SELECT * FROM @TAB

如果要将Table变量数据转储到一个Actual表中。

有关详细信息,请查看OUTPUT Clause (Transact-SQL)

现在您可以删除像

这样的TABLE1记录
DELETE FROM TABLE1 WHERE ID IN (SELECT ID FROM @TAB)

答案 1 :(得分:0)

您可以使用事务并回滚事务,而不是在测试结束时提交事务。

您可以使用显式事务执行此操作,或者在会话开始时使用set implicit_transactions on;并且不提交事务。

begin transaction test /* explicit transaction */

insert into TestTable (pk,col) values
  (1,'val');

update TestTable
  set pk=2 
  where pk=1;

select * 
  from TestTable 
  where pk = 2;

rollback transaction
--commit transaction

我不会在生产环境中执行此操作,因为事务将保持锁定直到事务完成,但如果您正在测试pk可能更改的插入,更新和删除的组合,这可能比尝试更安全跟踪所有更改以手动回滚。

这也可以防止您在测试中出错,无法手动回滚。

相关:How to: Write a SQL Server Unit Test that Runs within the Scope of a Single Transaction