Нужен скрипт / курсор, который запускается на сервере, чтобы посмотреть темп во всех размещенных базах данных

#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_», если они есть.