2012-08-23 28 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 
相关问题