3 回答
TA贡献1851条经验 获得超4个赞
没有。
您需要带WHERE子句的DELETE:这是标准SQL。
您可以做的是批量删除,如下所示:
SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
DELETE TOP (xxx) MyTable WHERE ...
或者,如果您要删除很高比例的行...
SELECT col1, col2, ... INTO #Holdingtable
FROM MyTable WHERE ..opposite condition..
TRUNCATE TABLE MyTable
INSERT MyTable (col1, col2, ...)
SELECT col1, col2, ... FROM #Holdingtable
TA贡献1873条经验 获得超9个赞
如果要删除表的一部分而不是表的一部分,可以做几件事TRUNCATE。
您可以将表的一部分选择到新表中,然后将两者切换,如下所示:
SELECT *
INTO tmp_MyTable
FROM MyTable
WHERE Key='Value'
IF @@ROWCOUNT > 0
BEGIN
EXEC sp_rename MyTable, old_MyTable, NULL
EXEC sp_rename tmp_MyTable, MyTable, NULL
TRUNCATE old_MyTable
END
其次,如果您使用的是分区,则可以在相同的分区方案上创建相同的(空)表。如果该表是根据存档/清除逻辑进行分区的,则可以将一个分区块从主表移至新表,然后截断新表。例如:
ALTER TABLE MyTable
SWITCH PARTITION 15 TO purge_MyTable PARTITION 2
GO;
TRUNCATE TABLE purge_MyTable
附言 分区在SQL 2005/08 Ent中可用。
希望这可以帮助!
TA贡献1820条经验 获得超9个赞
只是在一个临时表上遇到了类似的问题,该临时表在使用适当的锁进行扩展时遇到了问题。
由于相关表只为我们一个地方引用,因此我们只用动态表名查询替换了该引用,该查询是用类似于gbn建议的“ select into”创建的。
这是可维护的,因为临时表仅在代码中的一个地方被引用,并且额外的数据库调用和创建表的开销在仓库上下文中是合理的。如果您只有几百条记录或在代码中多次引用该表,则此方法可能不起作用。
添加回答
举报