简体   繁体   English

转换SQL脚本以在并行数据仓库上工作

[英]Convert SQL script to work on parallel data warehouse

I have SQL script which when executed runs on all database, Get list of all Tables with record count and Index created on that Table. 我有一个SQL脚本,当在所有数据库上运行该脚本时,获取具有记录计数的所有表的列表以及在该表上创建的索引。

However when I try to run that on parallel data warehouse server , Its giving me error. 但是,当我尝试在并行数据仓库服务器上运行它时,它给了我错误。 Because parallel data warehouse doesn't allow you to create temporary table variable,variables etc. 因为并行数据仓库不允许您创建临时表变量,变量等。

I have found alternative for table variable but didn't find anything about declaring varchar variables and then major concern is the way script is using database as variable in order to run the script on all database.I didn't find anything alternative of this. 我找到了表变量的替代方法,但没有发现有关声明varchar变量的任何信息,然后主要关注的是脚本将数据库用作变量的方式以便在所有数据库上运行脚本。我没有找到任何替代方法。

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

Now How can I make this work in parallel data warehouse 现在如何在并行数据仓库中进行这项工作

您可以使用未记录的sp_MSforeachdb过程在每个数据库上执行脚本。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM