我有临时数据从外部源上传到空的 SQL Server 表中。但并不总是相同的表。我需要在运行 MERGE 过程后清除这些表。
表格并不大,并且任何时候都不会填充大量数据。我似乎只能通过使用光标来做到这一点。
下面的代码可以工作,但是一定有更好的方法吗?
CREATE TABLE #Temp_TBL (name NVARCHAR(max));
INSERT INTO #Temp_TBL (name)
SELECT
t.name
FROM
SYS.DM_DB_PARTITION_STATS s
INNER JOIN
sys.tables t ON t.[object_id] = s.[object_id]
WHERE
s.row_count != 0
AND t.type_desc = 'USER_TABLE'
DECLARE @tableName nvarchar(max);
DECLARE cur CURSOR LOCAL FOR
SELECT name FROM #Temp_TBL
OPEN cur
FETCH NEXT FROM cur INTO @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('TRUNCATE TABLE '+ @tableName);
FETCH NEXT FROM cur INTO @tableName
END
CLOSE cur
DEALLOCATE cur
DROP TABLE #Temp_TBL
您可以使用
STRING_AGG
将整个内容聚合为一批。
您还需要架构名称,并且需要确保使用
QUOTENAME
正确引用名称。
DECLARE @sql nvarchar(max);
SELECT @sql = STRING_AGG(
'TRUNCATE TABLE ' + QUOTENAME(s.name) + '.' + t.name + ';', '
')
FROM sys.tables t
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE NOT EXISTS (SELECT 1
FROM sys.dm_db_partition_stats p
WHERE t.object_id = p.object_id
AND p.row_count != 0
);
PRINT @sql; -- your friend
EXEC sp_executesql @sql;