Выполнить операции со всеми таблицами во всех базах данных
Я пытаюсь создать сценарий SQL Server, который применяет некоторые операции ко всем таблицам во всех базах данных. Мне нужно переименовать некоторые таблицы, если соблюдаются некоторые условия, в противном случае обрезать таблицы.
Это мой сценарий
EXEC sp_MSforeachdb
@command1 = '
IF not exists(select 1 where ''?'' in (''master'',''model'',''msdb'',''tempdb''))
EXEC [?].dbo.sp_MSforeachtable
@command1 = ''
IF(substring(&, 1, 3)=pv_ and right(&, 5) != _data and right(&, 4) != _BCK)
exec sp_RENAME & , &_BCK''
ELSE IF (right(&, 4) != _BCK)
TRUNCATE TABLE &
@replacechar = ''&'''
Я получил некоторые ошибки, но я новичок в SQL Server, и я не знаю, как исправить этот скрипт.
Какие-либо предложения?
Большое спасибо
1 ответ
Решение
Вот решение для начала. Он не будет быстрым, но он зацикливает все таблицы всех баз данных на сервере. Внутри второго курсора вы можете определить, что делать с таблицей.
(Запрос не оптимизирован, просто быстрое решение)
DECLARE @DBName NVARCHAR(50)
DECLARE @TableName NVARCHAR(100)
DECLARE @DynamicSQL NVARCHAR(300)
DECLARE @DBCursor CURSOR
SET @DBCursor = CURSOR FOR
SELECT NAME FROM SYS.DATABASES
WHERE NAME NOT IN ('master','tempdb','model','msdb')
OPEN @DBCursor
FETCH NEXT FROM @DBCursor INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
CREATE TABLE #TempTableDatas
(
name varchar(100),
objectID int
)
SET @DynamicSQL = 'INSERT INTO #TempTableDatas
SELECT name, object_id FROM [' + @DBName + ']' + '.sys.Tables '
EXEC SP_EXECUTESQL @DynamicSQL
DECLARE @TableCursor CURSOR
SET @TableCursor = CURSOR FOR
SELECT name FROM #TempTableDatas
OPEN @TableCursor
FETCH NEXT FROM @TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @TableName, @DBName
FETCH NEXT FROM @TableCursor INTO @TableName
END
CLOSE @TableCursor
DEALLOCATE @TableCursor
DROP TABLE #TempTableDatas
FETCH NEXT FROM @DBCursor INTO @DBName
END
CLOSE @DBCursor
DEALLOCATE @DBCursor