2017-01-17 1 views
0

Для тестирования я вставляю кучу строк в базу данных SQLServer. Я хочу очистить их в конце. В то время как это должна быть конкретная база данных только для тестирования, я хочу, чтобы на самом деле был хорошо себя вести. По той же причине я не хочу делать предположения о том, какие данные могут быть уже в БД при удалении моих тестовых данных, например. удаление всех строк или всех строк с датами в определенном диапазоне.Возможно ли записать позже ссылки на INSERTed для удаления?

При вставке строк есть способ, которым я могу уловить ссылку на вставленные фактические строки, поэтому я могу позже удалить эти точные строки, независимо от того, были ли данные в них изменены. Значит, я знаю, какие точные строки у меня есть для теста?

Я вызываю запросы SQLServer из кода C# в рамках ms-test.

+0

Что об использовании временной таблицы для хранения этих строк? Затем удалите из базы данных, которая ищет временную таблицу – Petaflop

+1

. Я думаю, что эта помощь https://msdn.microsoft.com/en-us/library/ms177564.aspx –

+0

Это интересно, но действительно ли можно получить «идентификатор строки», SQLServer использует для идентификации каждой строки отдельно для моего ПК? –

ответ

2

Да, это возможно с предложением OUTPUT.

Вам необходимо создать одну промежуточную таблицу для записи вставленных значений идентификаторов записей.

DECLARE @TAB TABLE(ID INT) 

INSERT INTO TABLE1 
output inserted.Table1PK into @TAB 

SELECT id,name ... ETC 

Теперь проверьте переменные таблицы

SELECT * FROM @TAB 

Если вы хотите сбросить таблицы с переменными данными в одну таблицы Actual.

Для получения дополнительной информации смотрите на OUTPUT Clause (Transact-SQL)

Теперь вы можете удалить записи Table1 как

DELETE FROM TABLE1 WHERE ID IN (SELECT ID FROM @TAB) 
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 

Я бы не сделать это в производственной среде, так как транзакция будет удерживать блокировки, пока транзакция не будет завершена, но если вы тестируете комбинации вставки, обновления и удаления, где рк может измениться, это может быть безопаснее, чем пытаться отследить все ваши изменения, чтобы вручную отбросить их назад.

Это также защитит вас от ошибок в тестах, которые вы не сможете вручную отменить.

Похожие: How to: Write a SQL Server Unit Test that Runs within the Scope of a Single Transaction

+0

Интересно. Я не хотел упоминать, что я делаю это с C#. Любой шанс на пример (или кто-то другой, если вы не парень C#)? –

+0

В разделе try [этого примера из SqlTransaction.Rollback Method()] (https://msdn.microsoft.com/en-us/library/zayx5s0h (v = vs.110) .aspx), вы просто используйте 'transaction.Rollback();' вместо 'transaction.Commit();' – SqlZim