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

오류가 무엇입니까 (쿼리 그냥 빠른 해결책, optimalized되지 않음)? – Jim

답변

3

다음은 시작을위한 해결책입니다. 빠르지는 않지만 서버의 모든 데이터베이스 테이블을 루프합니다. 두 번째 커서 안에는 테이블과 함께 할 일을 속일 수 있습니다.

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