2012-08-23 52 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 
相關問題