2017-05-19 84 views
2

我有很长的脚本从表中的大量(超过100+)删除某些特定的数据,它看起来像这样更好的办法:处理许多delete语句

...

Delete from Table_name WHERE Company not in ('Company1','Company2') 
Delete from Table_name WHERE Company not in ('Company1','Company2') 
Delete from Table_name WHERE Company not in ('Company1','Company2') 
Delete from Table_name WHERE Company not in ('Company1','Company2') 

...

我想改变这个,所以我不必改变每一行的变量,我希望能够在开始时设置where语句,并且这将改变所有的删除行

declare .....something something 
SELECT CompanyID 
FROM _Company 
WHERE Company in ('Company1','Company2') -- I want to change this where statement only 

Delete from Table_name WHERE Company not in (variable) 
Delete from Table_name WHERE Company not in (variable) 
Delete from Table_name WHERE Company not in (variable) 
Delete from Table_name WHERE Company not in (variable) 
+1

请记住,如果单个事务尝试从任何给定表中删除超过5000行,SQL Server将执行**锁升级**。这会在该表上放置一个**独占锁**,甚至在该事务被提交(或回滚)之前阻止从该表中选择“SELECT”。尽量避免一次删除超过5000行 –

回答

3

你想要一个表变量。改变列名,数据类型为必要的:

DECLARE @idsToKeep TABLE (CompanyID int); 

INSERT @idsToKeep 
SELECT CompanyID 
FROM _Company 
WHERE Company IN ('Company1','Company2'); -- change this one place 

DELETE Table_name1 WHERE CompanyID NOT IN (SELECT CompanyID FROM @idsToKeep); 
DELETE Table_name2 WHERE CompanyID NOT IN (SELECT CompanyID FROM @idsToKeep); 
DELETE Table_name3 WHERE CompanyID NOT IN (SELECT CompanyID FROM @idsToKeep); 
-- etc 
+0

非常感谢,这为我节省了很多时间:) – Rubiano

0

另一个解决方案是在select语句和每个结果实体运行适当的变量DELETE语句来创建一个游标。

+0

如果有其他方法,不应该推荐使用游标。 http://stackoverflow.com/questions/287445/why-do-people-hate-sql-cursors-so-much –

+0

我没有说这是推荐的方法。我说“另一种解决方案是”,这意味着这是一个选择。 – Dave