为了测试,我将一堆行插入SQLServer DB。我想在最后清理它们..虽然这应该是一个特定的测试数据库,我希望表现良好,以防万一。出于同样的原因,我不想在删除测试数据时假设数据库中可能存在哪些数据,例如删除具有特定范围内日期的所有行或所有行。
当插入行时,我可以捕获对插入的实际行的引用,因此我可以稍后删除那些确切的行,无论它们中的数据是否已被修改。所以我知道我为测试确定了哪些行?
我在ms-test框架中调用来自C#代码的SQLServer查询。
答案 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