2012-08-23 4 views
2

Я пытаюсь создать сценарий 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, и я не знаю, как исправить этот сценарий.

Любые предложения?

Большое спасибо

+2

Какие ошибки? – Jim

ответ

3

Вот решение для начала. Он не будет быстрым, но он будет цитировать все таблицы всех баз данных на сервере. Внутри второго курсора вы можете обмануть, что делать со столом.

(Запрос не optimalized, только быстрое решение)

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 
Смежные вопросы