#sql-server #tsql
#sql-server #tsql
Вопрос:
Я настроил CMS, настроил список всех моих серверов. Я хочу иметь возможность запускать скрипт на сервере для просмотра временных таблиц, которые существуют во всех базах данных, размещенных на сервере. Я хочу удалить всю временную таблицу, которая начинается с ‘temp_%’. В настоящее время у меня 14 баз данных на одном сервере.
declare @sql nvarchar(max)
SET @sql = N'select name from [@DBName].sys.tables'
DECLARE @DBName4Loop sysname
declare @sql4Loop nvarchar(max)
DECLARE dbcursor CURSOR FAST_FORWARD FOR SELECT name FROM sys.databases
OPEN dbcursor
FETCH NEXT FROM dbcursor INTO @DBName4Loop
WHILE @@FETCH_STATUS = 0
BEGIN
print @DBName4Loop
SET @sql4Loop = REPLACE(@sql, '[@DBName]', '[' @DBName4Loop ']')
EXEC SP_EXECUTESQL @sql4Loop
FETCH NEXT FROM dbcursor INTO @DBName4Loop
END
CLOSE dbcursor
DEALLOCATE dbcursor
Я хочу иметь возможность удалять таблицы сразу, а не запускать все сразу.
Комментарии:
1. Под «temp» вы подразумеваете временные таблицы (имена которых начинаются с
#
) или фактически физические таблицы, имена которых начинаются сtemp
?2. Физические таблицы, которые начинаются только с Temp_
Ответ №1:
следующий скрипт выполнит эту работу:
DECLARE @DBName sysname
DECLARE dbcursor CURSOR FAST_FORWARD FOR SELECT name FROM sys.databases WHERE name NOT IN ('master','tempdb','msdb')
OPEN dbcursor
FETCH NEXT FROM dbcursor INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('USE ' @DBName)
DECLARE @tmpTable sysname = (SELECT TOP 1 name FROM sys.tables WHERE name LIKE 'temp_%')
WHILE @tmpTable IS NOT NULL
BEGIN
EXEC('DROP TABLE ' @tmpTable)
SELECT @tmpTable = name
FROM sys.tables
WHERE name LIKE 'temp_%'
END
FETCH NEXT FROM dbcursor INTO @DBName
END
CLOSE dbcursor
DEALLOCATE dbcursor
Курсор перебирает базы данных, и цикл while отбрасывает следующую найденную таблицу с префиксами «temp_», если они есть.