另一种选择:
WHILE EXISTS(select 1 FROM #wmsorder)
BEGIN
DELETE TOP (1)
FROM #wmsorder
END
但是,从表中逐一删除所有记录可能是一个表现地狱。您可能要考虑使用TRUNCATE TABLE
代替:
TRUNCATE TABLE #wmsorder
另外请注意,每个删除写入到数据库的日志,同时截断表不会被写入日志的。
测试包含100,000行,删除行一个接一个的临时表花了我9秒,而将truncate table立即完成:
-- create and populate sample table
SELECT TOP 100000 IDENTITY(int,1,1) AS Number
INTO #wmsorder
FROM sys.objects s1
CROSS JOIN sys.objects s2
-- delete rows one by one
WHILE EXISTS(select 1 FROM #wmsorder)
BEGIN
DELETE TOP (1)
FROM #wmsorder
END
-- clean up
DROP TABLE #wmsorder
-- create and populate sample table
SELECT TOP 100000 IDENTITY(int,1,1) AS Number
INTO #wmsorder
FROM sys.objects s1
CROSS JOIN sys.objects s2
-- truncate the table
TRUNCATE TABLE #wmsorder
-- clean up
DROP TABLE #wmsorder
我一个接一个地删除行因为我试图摆脱我使用的行。 –
我明白了。在这种情况下,您可能需要重新考虑整个脚本。你可能会发现一个基于集合的方式,无论你如何处理这些数据,而是逐一消耗行。 –