2015-07-24 1 views
0

J'ai un script SQL qui, lorsqu'il est exécuté, s'exécute sur toutes les bases de données, Obtenir la liste de toutes les tables avec nombre d'enregistrements et index créés sur cette table.Convertir le script SQL pour travailler sur l'entrepôt de données parallèle

Cependant quand j'essaye de courir cela sur le serveur parallèle d'entrepôt de données, C'est me donner l'erreur. Parce que l'entrepôt de données parallèle ne vous permet pas de créer une variable de table temporaire, des variables etc.

J'ai trouvé une alternative pour la variable table mais je n'ai rien trouvé à propos de la déclaration des variables varchar, puis la principale préoccupation est la façon dont le script utilise la base de données comme variable afin d'exécuter le script sur toutes les bases de données. Je n'ai trouvé aucune alternative à cela.

declare @TableList TABLE(Id int IDENTITY(1,1),DataBaseName VARCHAR(100),TableName VARCHAR(100),RecordCount INT,NameOfIndex VARCHAR(100),TypeOfIndex VARCHAR(100)) 
declare @TableListWithIndex TABLE(Id int IDENTITY(1,1),DataBaseName VARCHAR(100),TableName VARCHAR(100),NameOfIndex VARCHAR(100),TypeOfIndex VARCHAR(100)) 
declare @DatabaseNames TABLE(Id INT IDENTITY(1,1),NameOfDataBase VARCHAR(100),DataBaseSize VARCHAR(100),Remarks VARCHAR(500)) 
declare @sql varchar(1000) 
INSERT INTO @DatabaseNames 
EXEC sp_databases 



DECLARE @Count INT = 0,@Counter INT = 1 ,@NameOfDb VARCHAR(100); 

SELECT @Count = COUNT(1) FROM @DatabaseNames 


WHILE(@Count > 0) 
BEGIN 
    SELECT @NameOfDb = NameOfDataBase FROM @DatabaseNames WHERE Id = @Counter 

    SET @sql = N'SELECT '''+ @NameOfDb +''',T.name AS [TABLE NAME], 
      I.rows AS [ROWCOUNT] 
    FROM @NameOfDb.sys.tables AS T 
      INNER JOIN @NameOfDb.sys.sysindexes AS I 
        ON T.object_id = I.id 
         AND I.indid < 2 
    ORDER BY I.rows DESC'; 

    SET @sql = REPLACE(@sql, '@NameOfDb', @NameOfDb) 
    INSERT INTO @TableList(DataBaseName,TableName,RecordCount) 
    exec(@sql); 




    SET @sql = N'SELECT 
     '''+ @NameOfDb +''', 
     TableName = t.name, 
     IndexName = ind.name, 
     ind.type_desc 
    FROM 
     @NameOfDb.sys.indexes ind 
    INNER JOIN 
     @NameOfDb.sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id 
    INNER JOIN 
     @NameOfDb.sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id 
    INNER JOIN 
     @NameOfDb.sys.tables t ON ind.object_id = t.object_id 
    WHERE 
     ind.is_primary_key = 0 
     AND ind.is_unique = 0 
     AND ind.is_unique_constraint = 0 
     AND t.is_ms_shipped = 0 
    ORDER BY 
     t.name, ind.name, ind.index_id, ic.index_column_id '; 

    SET @sql = REPLACE(@sql, '@NameOfDb', @NameOfDb) 
    INSERT INTO @TableListWithIndex(DataBaseName,TableName,NameOfIndex,TypeOfIndex) 
    exec(@sql); 




    SET @Count = @Count - 1; 
    SET @Counter = @Counter + 1; 
END 

    update TL 
    SET TL.NameOfIndex = TLW.NameOfIndex,TL.TypeOfIndex = TLW.TypeOfIndex 
    from @TableList TL 
    INNER JOIN @TableListWithIndex TLW ON TL.TableName = TLW.TableName 
    AND TL.DataBaseName = TLW.DataBaseName 

    select * from @TableList 
    Where DataBaseName NOT IN ('tempdb','ReportServer$MSSQLSERVER2014TempDB','ReportServer$MSSQLSERVER2014','msdb','master','model') 
    order by DataBaseName 

maintenant Comment puis-je faire ce travail dans l'entrepôt de données en parallèle

Répondre

0

Vous pouvez utiliser la procédure sp_MSforeachdb sans papier pour exécuter le script sur chaque base de données.