不使用游标从表名列表中指定的空表

问题描述 投票:0回答:1

我有临时数据从外部源上传到空的 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
sql-server database-cursor
1个回答
0
投票

您可以使用

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;
© www.soinside.com 2019 - 2024. All rights reserved.